我使用以下代码替换字符串中匹配的单词:
for ($i=0; $i < count($terms); $i++) {
if ( $terms[$i] == '' || $terms[$i] == ' ' || strlen($terms[$i])==0 ) continue;
$searchingFor = "/" . $terms[$i] . "/i";
$replacePattern = "<strong>$0</strong>";
$result['titulo'] = preg_replace($searchingFor, $replacePattern, $result['title']);
}
echo $result['title'];
其中&#39;术语&#39;是来自$ _GET [&#39; terms&#39;]的数组。
除非用户输入包含斜杠等字符的字符串,否则一切正常。它在preg_replace中出现异常。
我该如何解决这个问题?
感谢。
答案 0 :(得分:2)
使用preg_quote:
$searchingFor = "/" . preg_quote($terms[$i], "/") . "/i";
此函数在preg语法(\
)中使用的所有字符之前以及第二个参数中的所有字符之前放置反斜杠. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
,此处用于转义分隔符/
。
答案 1 :(得分:0)
您可能需要考虑使用str_ireplace
来执行不区分大小写的替换而不是正则表达式:
$terms = array('cat', 'hat');
$result['title'] = "the CAT in the hat";
foreach ($terms as $term) {
if (trim($term) === '') continue;
$result['title'] = str_ireplace($term, "<strong>$term</strong>", $result['title']);
}
echo $result['title'];
输出:
帽子
中的 cat
这样做的一个潜在缺点是原始文本的情况丢失了,取代了替换数组中的术语。如果这是一个问题,您可以调整原始方法,但使用preg_quote
来转义输入中的字符:
$terms = array('c\a/t', 'hat?');
$result['title'] = "the C\A/T in the hat?";
$terms = array_filter($terms, 'strlen'); // filter out empty values
$patterns = array_map(function($t) { return "/" . preg_quote($t, "/") . "/i"; }, $terms);
$result['title'] = preg_replace($patterns, "<strong>$0</strong>", $result['title']);
echo $result['title'];
输出:
帽子中的 C \ A / T