我有两种类型的字符串:
$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_*
函数的情况下完成它。
答案 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>';