1

这是我需要能够做的事情:

我需要匹配以下标签:

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

我需要用符合 html3 的标签替换跨度,但将文本保留在两者之间。替换后的最终标签应如下所示:

<u>text sample</u>

我只是不擅长正则表达式,似乎无法想出答案。

先感谢您。

4

4 回答 4

5

正则表达式不是为标签操作而设计的。

如果你有任何形式的嵌套,它会变得混乱。

但是,鉴于提供的非常简单的示例,您也许可以这样做:

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


但这在很多方面都存在缺陷,您最好使用专为操作标签而设计的工具。

查看DOMDocument->loadHTML()相关函数

于 2009-02-24T23:26:19.037 回答
5

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

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

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

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

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

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

您需要更多说明吗?

使用 DomDocument::LoadFromHTML ;)

于 2009-02-25T07:07:50.673 回答
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),使用正则表达式执行此操作会变得非常复杂,而且你会更好关闭使用某种解析器。

于 2009-02-24T23:22:41.010 回答
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”以使其不区分大小写。

请注意,这并不是真正的正确方法。

于 2009-02-24T23:30:31.413 回答