使用正则表达式和php搜索,替换和重新组合

时间:2012-04-17 13:19:41

标签: php regex search replace

我想用regexp搜索并替换一些标签。

这是我的首发字符串:

<p>some bla bla bla</p>
<p class="normale">&bull;bla bla and bla</p><p class="normale">&bull;bla bla and bla</p>
<p class="normale">•bla bla and bla</p><p class="normale">&bull;bla bla and bla</p><p class="normale">&bull;bla bla and bla</p>
<p>other bla bla bla</p>
<p class="normale">&bull;bla bla and bla</p><p class="normale">&bull;bla bla and bla</p>
<p class="normale">•bla bla and bla</p><p class="normale">&bull;bla bla and bla</p>
<p>other bla bla bla</p>

这是我想要的结果

<p>some bla bla bla</p>
<ul><li>bla bla and bla</li><li>bla bla and bla</li>
<li>bla bla and bla</li><li>bla bla and bla</li><li>bla bla and bla</li></ul>
<p>other bla bla bla</p>
<ul><li>bla bla and bla</li><li>bla bla and bla</li>
<li>bla bla and bla</li><li>bla bla and bla</li>
<li>other bla bla bla</li></ul>

所以我想将所有<p>•<p>&bull;替换为<li>,将</p>替换为</li>并重新组合<li></li><li></li><li></li>的每一组} <ul></ul>

现在我做了一些测试,下面的代码是结果,但我认为不是最好的方法,重组部分不完整。

搜索和替换

// base string
$test = '<p>some bla bla bla</p>
  <p class="normale">&bull;bla bla and bla</p><p class="normale">&bull;bla bla and bla</p>
  <p class="normale">•bla bla and bla</p><p class="normale">&bull;bla bla and bla</p><p class="normale">&bull;bla bla and bla</p>
  <p>other bla bla bla</p>
  <p class="normale">&bull;bla bla and bla</p><p class="normale">&bull;bla bla and bla</p>
  <p class="normale">•bla bla and bla</p><p class="normale">&bull;bla bla and bla</p>
  <p>other bla bla bla</p>';
// First replace, I don't know but I can't find any • or &bull; with regexp
$text = str_replace(array('•', '&bull;'), '!SUB!', $text);
$regexp = '/(<p( class="normale"){0,}>(!SUB!))(.*?)<\/p>/';
// replace bulled paragraph with li tags
$text = preg_replace($regexp, "<li>$4</li>\n", $text);

但重新组合我发现的部分非常困难,我不知道如何继续

1 个答案:

答案 0 :(得分:1)

我赞同@Colin;但是,上面的Searching and Replace代码正在做你想要的吗?即它是否找到了•char?如果是这样,我建议不要使用!SUB!替换,但只是将其作为

的一部分包含在内
  

正则表达式:/ /(&lt; p(class =“normale”)?&gt;(&amp; bull; |•))(。*?)&lt; / p&gt; /

如果没有,那么你必须找到相应的ASCII表示(十六进制或八进制)并将其放在regex.<br>

内的位置

一旦你到目前为止,XML解析器将快速处理它的重新排序部分。 : - )