Знаете ли вы, что аргумент regex для любой из функций preg_
в PHP должен иметь двойной разделитель? Например:
preg_match_all(`'/foo/'`, $target, $results)
'...'
- это строка разделители, /.../
- регулярное выражение разделители, а фактическое регулярное выражение foo
. Разделители регулярных выражений не должны быть косыми чертами, они просто должны совпадать; Некоторые популярные варианты #...#
, %...%
и ~...~
. Они также могут быть сбалансированными парами символов в скобках, например {...}
, (...)
, [...]
и <...>
; они гораздо менее популярны и не зря.
Если вы пропустите разделители регулярных выражений, фаза компиляции регулярных выражений, вероятно, потерпит неудачу, и сообщение об ошибке, вероятно, не будет иметь смысла. Например, этот код:
preg_match_all('<td style="white-space:nowrap;">###.##</td>', $s, $m)
... сгенерирует это сообщение:
Unknown modifier '#'
Он пытается использовать первую пару угловых скобок в качестве разделителей регулярных выражений и все, что следует за >
в качестве модификаторов регулярных выражений (например, i
для регистра без учета регистра, m
для многострочного). Чтобы это исправить, вы должны добавить real regex delimiters, например, так:
preg_match_all('%<td style="white-space:nowrap;">###\.##</td>%i', $s, $m)
Выбор разделителя зависит от личных предпочтений и удобства. Если бы я использовал #
или /
, мне пришлось бы избегать этих символов в настоящем регулярном выражении. Я избежал .
, потому что это метасимвол регулярного выражения. Наконец, я добавил модификатор i
, чтобы продемонстрировать использование модификаторов и потому что HTML не чувствителен к регистру.