Неизвестная ошибка модификатора в регулярном выражении 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
Другие вопросы по тегам