Странное поведение в регулярном выражении - PullRequest
3 голосов
/ 19 июня 2011

Я заменял пустые строки для тега <p>.Регулярное выражение заменяет все черные линии, допускающие пробелы (\ s), для одного тега <p>.

Например, эта строка:

$string="with.\n\n\n\nTherefore";

Но возвращает 2 <p> тегов.

Итак, я сделал этот тест: (Это не для замены

, просто для теста)

$string="with.\n\n\n\nTherefore";
$string=preg_replace('/(^)(\s*)($)/m','[$1]|$2|($3)',$string);
echo $string;

И проверьте, что получится:

with.
[]|

|()[]||()
Therefore

Воображая:

with.\n
^\n
\n
$^\n$\n
Therefore

Регулярное выражение добавляет один \ n, а четвертое не делает то, что "она" должна сделать. (Перейти к другой строке).

Кто-то, кто можетПомогите.в основном объяснить, а не решить проблему.Спасибо evryone.

1 Ответ

4 голосов
/ 19 июня 2011

Ваше регулярное выражение должно соответствовать хотя бы одному пробелу. Так что замените \s* на \s+ или, если ему нужно убежать \s\+


\s* будет соответствовать каждому отдельному символу, потому что он соответствует любому (*) пробелу (\s), а из-за любой он включает нет . Я имею в виду, что в строке 'abc' \s* будут совпадать символы " empty " между ^ и a, a и b. ',' b 'и' c ',' c 'и' $ '.

Это действительно легко проверить на терминале Linux, как это:

$ echo "abc" | sed 's:\s*:\n:g'  # replace \s* with \n for the whole string 

a
b
c

$ # ^ the result

Как видите, он соответствует каждому «пустому» символу и заменяет его на \n

С другой стороны, \s+ заставит регулярное выражение совпадать с по крайней мере 1 (+) символом пробела (\s), поэтому он работает как положено.

...