preg_replace只包含标记

时间:2011-07-29 01:30:16

标签: php regex

我有一个像下面的html代码(只是其中的一部分)

<p>
  <strong>
    <div align="center">
      <a onclick="return hs.expand(this)" href="http://example.com/somesome.png">
        <img title="some-bla-bla-text" src="http://example.com/somesome.png" 
             alt="some-bla-bla-text" />
      </a>
    </div>
  </strong><br />
  <strong>
    <div align="center">...

并希望将其删除为

<p>
  <strong>
    <div align="center">
      <img title="some-bla-bla-text" alt="some-bla-bla-text" />
    </div>
  </strong><br />
  <strong>
    <div align="center">...

如何删除<a onclick="return hs.expand(this)" href="http://example.com/somesome.png">及其结束标记</a>此字符串的一部分?

我认为<a onclick="return hs.expand(this)"....></a>之间匹配的正则表达式非常有用

3 个答案:

答案 0 :(得分:4)

正则表达式不够强大,因为HTML不是常规语言。它可能在某些情况下有效,但是当给出不同的,完全有效的HTML输入时,它将是非常脆弱的代码。你应该研究DOMDocument。它允许您轻松解析HTML。

答案 1 :(得分:2)

通过一些测试和调整,你可能会得到类似以下内容的工作

$html = preg_replace('/\<a[^>]*\>((?!\<\/a\>).)*\<\/a\>/i', '\1', $html);

它基本上说,找到一个打开的标签,然后找到所有内容直到下一个关闭标签

答案 2 :(得分:1)

您可以使用正则表达式执行所需操作,但需要提供更多详细信息。你想删除所有锚元素,用它们里面的东西替换它们吗?或者只包含那些包含IMG标签的人?这是一个正则表达式,只剥离那些第一个属性为onclick

$s= preg_replace('~\s*<a\s+onclick="[^"]*"[^>]*>((?:(?!</a>).)*)</a>\s*~is', '$1', $s);

<强> see a demo on ideone.com


编辑:此正则表达式将匹配具有onclick属性的锚元素(不一定是第一个)。

'~\s*<a[^>]*\s+onclick="[^"]*"[^>]*>((?:(?!</a>).)*)</a>\s*~is'

<强> demo