-1

我有一些 HTML 内容,我想替换一个标签:

<span class='c1'>MY TEXT</span>

并保留我的文字。我试过:

$result = preg_replace('/(<span class=\'c1\'>)(.*)(<\/span>)/', '$2', $my_string);

但是封闭标签仍然存在?你能帮我解释一下我的错误在哪里吗?我要提高自己!谢谢

4

5 回答 5

2

尝试使用惰性匹配(.*?)而不是贪婪匹配(.*)

贪婪匹配意味着它会在完成之前尽可能地匹配,所以如果你在</span>某个地方有另一个,它会匹配那个。例如:

使用贪心匹配:

<span class='c1'>MY TEXT</span><span class='c1'>MY OTHER TEXT</span>
                 ^--greedy match will go from here to here--^

使用惰性匹配:

<span class='c1'>MY TEXT</span><span class='c1'>MY OTHER TEXT</span>
                 ^-lazy^                        ^---lazy----^
于 2012-07-23T07:55:02.737 回答
0

尝试一下

$result = preg_replace('/(\<span class=(\'|\")?c1(\'|\")?\>)(.*)(\<\/span\>)/i', '$4', $my_string);
于 2012-07-23T07:54:26.990 回答
0

您的全匹配组可能消耗太多,而您</span>从尾随内容中看到另一个。你应该试试

$result = preg_replace('/(<span class=\'c1\'>)(.*?)(<\/span>)/', '$2', $my_string);

它使用了一个不贪婪的全匹配 ( .*?)。

于 2012-07-23T07:54:46.007 回答
0

使用Simple HTML DOM,它是处理 HTML 元素的最佳解决方案。

例子:

require_once('simple_html_dom.php');
$html = str_get_html('<span class="c1">MY TEXT</span>');
$text = $html->plaintext;

或者,如果您有一个完整的 HTML 文档(而不仅仅是一个 HTML 片段):

require_once('simple_html_dom.php');
$html = str_get_html('html goes here');
$text = $html->find('span.c1', 0)->plaintext; // Find text from first <span> with the class 'c1'

就这么简单。

于 2012-07-23T08:13:40.550 回答
0

这会给你完美的结果:

preg_match_all('/<span(.*?)class=\'c1\'>(.*?)<\/span>/', '$2', $my_string, PREG_PATTERN_ORDER);
for ($i = 0; $i < count($result[0]); $i++) {
   echo $result[0][$i];
}
于 2012-07-23T08:15:18.533 回答