Preg_replace,指向选择之后和之前

时间:2013-12-01 20:47:46

标签: php preg-replace

<div style="display:none">250</div>.<div style="display:none">145</div>

id想:

<div style="display:none">250</div>#.#<div style="display:none">145</div>

或者像这样:

<div style="display:none">111</div>125<div style="display:none">110</div>

id想要

<div style="display:none">111</div>#125#<div style="display:none">110</div>

id就像一个preg替换,将这些标签放在麻木周围,所以我认为REGEX看起来像这样:

"<\/div>[.]|<\/div>\d{1,3}"

数字(如果是数字,可以是1-3位数字),或者它可以是一个点。

无论如何,我不知道如何更新以取代价值:

"<\/div>[.]|<\/div>\d{1,3}" replace: $0#

在值之后插入..

修改

我无法使用HTML解析器,因为我找不到威胁样式/类作为纯文本,并且我需要附加值,以确定元素是否可见:(

是的,它让我疯了,但我差点儿完成了:)

2 个答案:

答案 0 :(得分:3)

你真的不应该尝试使用正则表达式解析HTML。我知道只有几个人可以做到这一点。即使你本来就是其中之一,正则表达式仍然不适合这项工作。使用PHP的DOMDocument可选DOMXPath

使用xpath:

$dom = new DOMDocument();
$dom->loadHTML($html);

$xpath = new DOMXPath($dom);

$textNode = $xpath->query('//text()')->item(1);

$textNode->parentNode->replaceChild($dom->createTextNode('#' . $textNode->textContent . '#'), $textNode);

echo htmlspecialchars($dom->saveHTML());

http://codepad.viper-7.com/KLTLDA

使用子节点:

$dom = new DOMDocument();
$dom->loadHTML($html);

$body = $dom->getElementsByTagName('body')->item(0);
$textNode = $body->childNodes->item(1);

$textNode->parentNode->replaceChild($dom->createTextNode('#' . $textNode->textContent . '#'), $textNode);

echo htmlspecialchars($dom->saveHTML());

http://codepad.viper-7.com/Ii4vPb

答案 1 :(得分:1)

在你的情况下,

preg_replace("~</div\s*>(\.|\d{1,3})<div~i", '</div>#$1#<div', $string);

假设div和内容之间没有空格,而且之间没有其他任何奇怪的东西。

请注意,正则表达式非常脆弱,即使是最轻微的HTML更改也会无声地失败。