Неизвестная ошибка модификатора в регулярном выражении php
У меня есть блоки свободного текста, которые содержат несколько трехзначных цен, которые мне нужно записать. При желании они начинаются с '$' или, альтернативно, с пробела
Я имею:
preg_match_all("|[\s|\$][\d]{3}|", $html, $prices);
Это дает мне:
Severity: Warning
Message: preg_match_all(): Unknown modifier '$'
Как я могу это исправить?
2 ответа
Вы используете трубы в качестве разделителей для регулярного выражения, а также использовали трубу в классе символов. Если вы имеете в виду "пробел / табуляция / символ новой строки или знак доллара", просто отбросьте трубу в первом классе символов, он вам не нужен, и он приносит больше вреда, чем пользы.
preg_match_all
видит эту часть как регулярное выражение: [\s
и модификаторы как \$][\d]{3}|
... что он не может понять.
В противном случае используйте другой разделитель, если вы намеревались сопоставить трубу, такую как тильда или косая черта, с которой знакомы большинство людей (или любой другой символ, который не будет мешать регулярному выражению):
preg_match_all("~[\s|\$][\d]{3}~", $html, $prices);
preg_match_all("/[\s|\$][\d]{3}/", $html, $prices);
Прежде всего, не оборачивайте RegExps специальными символами, такими как |
или же .
, Просто используйте ~
как я делаю, поскольку это почти никогда не происходит в шаблоне регулярных выражений, сравните с /
что происходит очень часто в HTML и URL.
Вы должны использовать одинарные кавычки, чтобы включить $
, То, что вы делаете там, эквивалентно '$'
в регулярном выражении Пока хочешь '\$'
, Так что вам нужно использовать одинарные кавычки или просто использовать '\\\$'
, Но используйте одинарные кавычки, если вам не нужны переменные PHP, встроенные в строку с "{$var}"
,
preg_match_all('~[\s|\$][\d]{3}~', $html, $prices); // try this