Почему мое регулярное выражение удаляет пробелы? - PullRequest
3 голосов
/ 13 августа 2010
$str = "& &svnips   Â ∴ ≈ osidnviosd & sopinsdo";   
$regex = "/&[^\w;]/";
echo preg_replace($regex, "&", $str);

Я пытаюсь заменить все некодированные амперсанды кодированными.
Проблема в том, что он удаляет пробел между & и sopinsdo.

Есть идеи, почему?

Ответы [ 4 ]

2 голосов
/ 13 августа 2010

Зачем использовать регулярные выражения?Почему бы не использовать htmlspecialchars()?

echo htmlspecialchars($str, ENT_NOQUOTES, 'UTF-8', false);

Обратите внимание на четвертый параметр.Он говорит, что ничего не кодировать дважды.Таким образом, в основном это превратит все < в &lt;, все > в &gt; и все &, которые не являются частью существующей сущности, в &amp;

Но, если вынеобходимо использовать регулярное выражение, вы могли бы сделать:

$regex = '/&([^\w;])/';
echo preg_replace($regex, '&amp;\1', $str);

По сути, он сохраняет несловарный символ, а затем добавляет его обратно ...

2 голосов
/ 13 августа 2010

Вы ищете 2 символа («&» и символ НЕ (; или \ w)) и заменяете его на &amp;

Вы должны заменить на &amp; (добавить пробел в конец строки замены)

1 голос
/ 14 августа 2010

Это регулярное выражение делает то, что вы ищете.

preg_replace('/&(?!\w+;)/', '&amp;', $text);

Так что для нескольких простых тестовых случаев вы можете получить правильно экранированный HTML:

'& sopinsdo'          -> '&amp; sopinsdo'
'&amp; sopinsdo'      -> '&amp; sopinsdo'
'sopinsdo & foo; bar' -> 'sopinsdo &amp; foo; bar'
'sopinsdo &foo bar'   -> 'sopinsdo &amp;foo bar'
0 голосов
/ 13 августа 2010

То есть вы не хотите, чтобы пространство между & и sopinsdo было удалено. Просто добавьте один

echo preg_replace($regex, "&amp; ", $str);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...