Preg_replace,在选择之后和之前点


Preg_replace, point after and before selection

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

想要的号码:

<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解析器,因为我找不到不会威胁样式/类的纯文本解析器,并且我需要附加的值来确定该元素是否可见:(

是的,这让我发疯,但我几乎完成了:)

你真的不应该尝试用正则表达式解析 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

在您的情况下,

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

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

请注意,正则表达式非常脆弱,即使在 HTML 中最轻微的更改时也会静默失败。