preg_replace用于查找字符串并更改其中的多个不同字符串

时间:2012-03-25 03:52:41

标签: php regex preg-replace

长文本中有字符串:

<fn id="T1FN1"> anytext <p> sometext </p> </fn>
<fn id="T2FN1"> anytext <p> sometext </p> </fn>
<fn id="T2FN2"> anytext <p> sometext </p> </fn>
<fn id="F12FN5"> anytext <p> sometext </p> </fn>

等...

我想找到     文本中的<fn </fn>并删除     <p> and </p> 只是从这些字符串中,<p> and </p>之间的字符串不会被删除。我尝试了一些preg_replace,但没有成功。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用嵌套的正则表达式:

$html = '<fn id="T1FN1"> anytext <p> sometext </p> </fn>
        <fn id="T2FN1"> anytext <p> sometext </p> </fn>
        <fn id="T2FN2"> anytext <p> sometext </p> </fn>
        <fn id="F12FN5"> anytext <p> sometext </p> </fn>';

preg_replace_callback('/<fn[^>]*>.*?<p>.*?</p>.*?</fn>/', function($matches){
    return preg_replace('/<p>|</p>/', '', $matches[0]);
}, $html);

注意:this syntax requires PHP 5.3+。如果你正在运行旧版本,请告诉我,我将提供相应的语法。

答案 1 :(得分:0)

试试这个:

$s=<<<HDOC
<fn id="T1FN1"> anytext <p> sometext </p> </fn>
<fn id="T2FN1"> anytext <p> sometext </p> </fn>
<fn id="T2FN2"> anytext <p> sometext </p> </fn>
<fn id="F12FN5"> anytext <p> sometext </p> </fn>
<fnn id="F12FN5"> anytext <p> these tags stay </p> </fnn>
<p> some text that stays with tags </p>

HDOC;
$pattern = '/(<fn[^>]*>[^<]*)<p>([^<]*)<\/p>([^<]*<\/fn>)/';
$replace = '\1\2\3';
echo htmlspecialchars(preg_replace($pattern, $replace, $s));

警告:只会找到一对<p></p>,anaytext中不能包含标签