Когда я написал следующее, я получаю такое предупреждение, и оно ничего не соответствует, но я уверен, что $row_search['content']
содержит $value
…
preg_match_all("/[^\s]*".preg_quote($value)."[^\s]*/iu", $row_search['content'], $final_matched); WARNING:preg_match_all() [function.preg-match-all]: Unknown modifier '/' in C:\xampp\htdocs\finance\search\search.php on line 82
почему я получаю такое предупреждение?
благодаря
Я предполагаю, что $value
содержит косую черту /
, которую не preg_quote
:
Специальные символы регулярного выражения:.
. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
Передайте разделитель, который вы используете для функции:
preg_match_all("/[^\s]*".preg_quote($value, '/')."[^\s]*/iu", $row_search['content'], $final_matched); // ---^
или использовать другой разделитель.
Вы должны изменить свой preg_quote($value)
на preg_quote($value, "/")
чтобы избежать разделителя.
В вашем примере, если $value
содержит «(content / other)», он будет экранироваться как «(контент / другое)», и это в вашем регулярном выражении будет /[^\s]*\(content/other\)[^\s]*/iu
как вы можете видеть, есть /, который приведет к сбою вашего регулярного выражения. Если вы явно говорите, что «/» является разделителем, тогда регулярное выражение будет /[^\s]*\(content\/other\)[^\s]*/iu
/
не является метасимволом PCRE, поэтому, хотя вы используете его как разделитель в своем регулярном выражении, preg_quote()
не preg_quote()
от него, потому что он не знает, что вы используете его как разделитель. Вам придется передать его в качестве второго параметра, как сказали остальные, для того, чтобы он тоже ускользнул:
preg_match_all("/[^\s]*".preg_quote($value, '/')."[^\s]*/iu", $row_search['content'], $final_matched);
Укажите /
как разделитель при использовании preg_quote
:
preg_match_all("~/[^\s]*~".preg_quote($value, '/')."[^\s]*/iu", $row_search['content'], $final_matched);
В противном случае значение a в значении $value
не будет экранировано.