Как заменить множественные и пробельные символы одним и уменьшить пробельные символы только до одного пробела? - PullRequest
1 голос
/ 02 апреля 2019

У меня есть следующий пользовательский текст и HTML:

$text = "<p>Hello World!&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Javascript development&nbsp;PHP Developer&nbsp;</p>";

Как я могу изменить этот текст, используя регулярные выражения, на следующее:

"<p>Hello World!&nbsp;Javascript development&nbsp;PHP Developer</p>"

Код:

$text = "<p>Hello World!&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Javascript development&nbsp;PHP Developer&nbsp;</p>";
$result = preg_replace("/(&nbsp;)+/", "&nbsp;", $text);
echo $result;

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Вы можете использовать

$find = ['/^((?:&nbsp;|\s)+)|(?1)$/', '/\s*&nbsp;(?:\s*&nbsp;)*\s*/', '/\s+/'];
$replace = ['', '&nbsp;',' '];
$text = preg_replace($find, $replace, trim($text));

См. Демоверсию PHP .

Детали

  • '/^((?:&nbsp;|\s)+)|(?1)$/' => '' удаляет &nbsp; и пробелы в начале / конце строки ((?1) здесь просто повторяется (?:&nbsp;|\s)+ и здесь, чтобы сделать шаблон немного короче)
  • '/\s*&nbsp;(?:\s*&nbsp;)*\s*/' => '&nbsp;' заменяет все последовательности пробелов и &nbsp; как минимум с одним &nbsp; на один &nbsp;
  • '/\s+/' => ' ' заменяет 1+ пробелов на 1 обычный пробел.
0 голосов
/ 02 апреля 2019

Ваш входной текст содержит пробелы после большинства &nbsp;, которые не учитывает регулярное выражение. Вы можете использовать \s*, чтобы разрешить ноль или более пробелов до и после каждой неразрывной пробеловой сущности HTML.

$result = preg_replace('/(\s*&nbsp;\s*)+/', '&nbsp;', $text);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...