我需要一个php正则表达式,用一个标签替换另一个标签

时间:2009-02-24 23:18:23

标签: php html regex html-manipulation

以下是我需要做的事情:

我需要匹配以下标记:

<SPAN style="TEXT-DECORATION: underline">text sample</SPAN>

我需要用符合html3标签替换span,但保留文本。更换后,最终标签应如下所示:

<u>text sample</u>

我对正则表达式不满意,似乎无法得出答案。

提前谢谢。

4 个答案:

答案 0 :(得分:5)

正则表达式不适用于标记操作。

如果您正在进行任何形式的嵌套,它会变得混乱。

但是,考虑到提供的非常简单的示例,您可以这样做:

$MyString = preg_replace
    ( '/(?si)<SPAN\s+style\s*=\s*"TEXT-DECORATION:\s*underline;?"\s*>(.*?)<\/SPAN>/'
    , '<u>$1</u>'
    , $MyString
    );


但是这在很多方面存在缺陷,而且你最好使用专为操纵标签而设计的工具。

查看DOMDocument->loadHTML()related functions

答案 1 :(得分:5)

不要将常规表达式用于PARSE HTML

do not use regular expressions to parse HTML

不要使用正则表达式来解析HTML

do not use regular expressions to parse HTML

do not use regular expressions to parse HTML

do not use regular expressions to parse HTML

你需要更多澄清吗?

使用DomDocument :: LoadFromHTML;)

答案 2 :(得分:0)

你需要这样的几行:

preg_replace('|<SPAN style="TEXT-DECORATION: underline">(.+?)</SPAN>|', '<u>$1</u>', $text);
preg_replace('|<SPAN style="FONT-WEIGHT: bold">(.+?)</SPAN>|', '<b>$1</b>', $text);
preg_replace('|<SPAN style="FONT-STYLE: italic">(.+?)</SPAN>|', '<i>$1</i>', $text);

等。虽然标签不可能完全匹配那些正则表达式(通常情况下,除非是非常简单的机器生成的HTML),但使用正则表达式执行此操作会变得非常复杂,并且你最好使用某种解析器。

答案 3 :(得分:0)

关于你给出的基本例子。

<?php 
$string = '<SPAN style="TEXT-DECORATION: underline">text sample</SPAN>';
$pattern = '/<SPAN style=\"TEXT-DECORATION: underline\">(.+?)<\/SPAN>/';
$replacement = '<u>$1</u>'
echo preg_replace($pattern,$replacement,$string);
?>

会做到这一点。 模式正则表达式非常简单 - 它正是你正在寻找的(带引号和'/'转义)和(。+?),它表示包括所有可能的字符,直到SPAN标记结束。这假设您的代码是一致格式化的,您可以在$ pattern的末尾附加一个'i',以使其不区分大小写。

请注意,这不是正确的做法。