使用preg_replace并忽略特殊字符

时间:2014-11-04 05:59:57

标签: php html regex preg-replace preg-match

我有两种类型的字符串:

$s1 = hello <em>worlds</em>
$s2 = Hello World's

我希望$s2成为Hello <em>World's</em>

我试图通过以下方式实现这一点:

preg_match_all('/<em>(.+?)<\/em>/i', $s1, $hits);
foreach ($hits[1] as $hit) {
    $s2 = preg_replace($hit, '<em>$0</em>', $s2);
}

它没有对可能有特殊字符的字符串($ s2)进行操作。

可能有多个<em>标记实例,或大写小写的不同情况例如:

$s1 = <em>hellos</em> <em>where</em> are <em>you</em>? 
$s2 = hello's where are YOU? 

修改

我不想使用任何HTML解析器。我正在寻找一个没有任何解析器的PHP解决方案。我在努力寻求解决方案方面走得很远。所以,我希望必须有一种方法可以在没有解析器和使用preg_*函数的情况下完成它。

1 个答案:

答案 0 :(得分:0)

像你这样的问题,主要是你前一段时间在你的项目中失去正确道路的信号......

但是如果你喜欢玩杂乱,你可以动态地构建你的模式,并期望到处都有一些自定义的特殊字符集。以下是如何做到这一点的小例子。

<?php
# Array of chars You want to ignore. 
# Make sure to esape special chars as perceived in [] brackets.
$special_chars_array = array("'","\[");

$s1 = "hello <em>worlds</em>";
$s2 = "Hello W[orld's";
preg_match_all("/<em>(.+?)<\/em>/i", $s1, $hits);
# Make set from Your char array, or You cloud insert "?" after each char - as You see fit
$special_chars_pattern = sprintf("[%s]?",implode("",$special_chars_array));
foreach ($hits[1] as $hit) 
{
    # Some messing with strings and arrays to get what is needed
    $pattern = implode($special_chars_pattern,str_split($hit)).$special_chars_pattern;
    echo sprintf('For hit "%s" pattern "%s" was made.',$hit,$pattern);
    $s2 = preg_replace(sprintf('#%s#i',$pattern), '<em>$0</em>', $s2);
}
echo '<pre>';
echo $s2;
echo '</pre>';