【问题标题】:Regex for replacing <p class="someClass"> with <h2> tag?用 <h2> 标签替换 <p class="someClass"> 的正则表达式?
【发布时间】:2012-10-28 09:51:43
【问题描述】:

我需要全部替换:

<p class="someClass someOtherClass">content</p>

<h2 class="someClass someOtherClass">content</h2>

在一串内容中。基本上我只想用"h2" 替换"p"

这是我目前所拥有的:

/<p(.*?)class="(.*?)pageTitle(.*?)">(.*?)<\/p>/

这匹配整个&lt;p&gt; 标签,但我不确定如何将&lt;p&gt; 替换为&lt;h2&gt;

我该怎么做呢?

【问题讨论】:

  • 嗯,是的,我知道,但我不知道如何写出实际的表达式!
  • @qwerty 可能是因为这个问题被问了很多次(但用另一种表达方式)?看看simplehtmldom.sourceforge.net你可能不需要正则表达式...
  • 使用 dom 解析器替换页面上的一个或两个

    标签似乎有点“太多”,当您可以使用 preg_replace() 的单行解决方案时。当然,我在创建这个问题之前进行了搜索,但我没有找到任何可以回答我的问题的内容(使用 preg_replace)

  • @qwerty 好吧,您还没有指定是否要针对具有特定类的

    标记或所有

    标记...

标签: php regex replace paragraph html-heading


【解决方案1】:

以下应该做你想要的:

$str = '<p>test</p><p class="someClass someOtherClass">content</p>';

$newstr = preg_replace('/<p .*?class="(.*?someClass.*?)">(.*?)<\/p>/','<h2 class="$1">$2</h2>',$str);

echo $newstr;

点(.) 匹配所有。星号匹配 0 或任意数量的匹配。括号内的任何内容都是一个组。 $2 变量是对匹配组的引用。大括号内的数字({1})是一个量词,表示匹配前一个组一次。该量词可能不需要,但无论如何它都在那里并且工作正常。反斜杠转义任何特殊字符。最后,问号使.* 位是非贪婪的,因为默认情况下它是。

【讨论】:

  • 几乎!但是&lt;p&gt; 标记的类可能不同,我也想将&lt;p&gt; 标记中的所有类“复制”到&lt;h2&gt; 标记,我不想对其进行硬编码。这可能吗?
  • @qwerty 是的。只需将class="etc" 替换为$1。我将编辑上面的示例来做到这一点。
  • @qwerty 你能扩展一下“不同”吗?在这方面更多的数据会更好,例如类的顺序不同。
  • 只要someClass存在,并且是&lt;p&gt;标签,我想把它做成&lt;h2&gt;标签,但如果它还有其他类,我还是想做它是一个&lt;h2&gt; 标签。所以,&lt;p class="someClass"&gt;content&lt;/p&gt; 将变为 &lt;h2 class="someClass"&gt;content&lt;/h2&gt;&lt;p class="class someClass class"&gt;content&lt;/p&gt; 将变为 &lt;h2 class="class someClass class"&gt;content&lt;/h2&gt;
  • @qwerty 我已经更新了我的答案。只要someClass 存在于类标记中,它将匹配&lt;p&gt; 标记。如果其他类在该标签内,它也会复制这些。
【解决方案2】:

不要做得更好,但会有所帮助:)

$text = '<p class="someClass someOtherClass">content</p>';
$output = str_replace( array('<p', '/p>'), array('<h2', '/h2>'), $text );

【讨论】:

  • 问题在于它替换了 all &lt;p&gt; 标签。我只想用指定的类替换&lt;p&gt;标签。
【解决方案3】:

它会起作用的:)

preg_replace('/<p .*?class="(.*?)">(.*?)<\/p>/','<h2 class="$1">$2</h2>',$value);

【讨论】:

  • 如果在

    标记中提到了属性,而您必须完全保留它们并仅替换其中的

    Test

    更改为
    Test
【解决方案4】:

抱歉,晚会有点晚了。我使用了答案中的正则表达式:

$str = '<p>test</p><p class="someClass someOtherClass">content</p>';

$newstr = preg_replace('/<p .*?class="(.*?someClass.*?)">(.*?)<\/p>/','<h2 class="$1">$2</h2>',$str);

echo $newstr;

当你有更多的 p 标签时,这种方法会出现问题,比如在一个文本块中: 以下是我如何强化正则表达式以涵盖这种情况:

$newstr = preg_replace('/<p [^<]*?class="([^<]*?someClass.*?)">(.*?)<\/p>/','<h2 class="$1">$2</h2>',$str);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多