регулярное выражение preg_replace для поиска чисел, перед которыми стоят буквы - PullRequest
0 голосов
/ 05 октября 2009

Я действительно запутался в использовании preg_replace, но медленно учусь.

Мне нужна помощь с функцией:

$str= preg_replace('#\W\d+#', '\W \d+', $str);

Идея состоит в том, что я ищу числа, в которых есть буквы непосредственно перед ними без пробелов,

т.е. abc123 . (НЕ 'abc 123' и НЕ '123abc')

и как мне просто вставить пробел или символ между ними, чтобы abc123 стал abc 123 или abc @@ 123

спасибо всем!

Ответы [ 3 ]

3 голосов
/ 05 октября 2009

Вы хотите

$str= preg_replace('#([A-Za-z]+)(\d+)#', '$1 $2', $str);

\W не делает то, что вы думаете; \w означает «символ слова», а \W означает « не слово». Поскольку вы конкретно хотите букв , однако, ни то, ни другое не соответствует тому, что вы хотите, и вам нужен [A-Za-z], который является классом символов, соответствующим всем буквам. Вам также нужно + после него, чтобы соответствовать «одному или нескольким».

Скобки - это то, как вы «захватываете» часть выражения для дальнейшего использования; $1 и $2 ссылаются на текст в скобках.

2 голосов
/ 05 октября 2009
<?php

$str = 'abc()1234';
$str= preg_replace('#([a-zA-Z()])(\d+)#', '$1 $2', $str);

echo $str;

Выход:

abc () 1234

$ 1 и $ 2 являются обратными ссылками и относятся к первой и второй захваченным группам соответственно. Дополнительная информация @ http://www.regular -expressions.info / brackets.html .

0 голосов
/ 05 октября 2009

Вы можете увидеть разницу между /([A-Za-z])(\d+)/ и /([A-Za-z]+)(\d+)/ в онлайн-тестере регулярных выражений PHP . Оба работают с preg_replace в вашем случае. Но последний также работает с preg_match_all, поэтому он более устойчивый.

...