如何仅在可见的html中匹配{Tags}而不在元素属性空间内?

时间:2016-06-21 05:11:51

标签: php html regex tags

是否有可能只使用regexp(和/或php)来获取特定模式之外的特定模式,并且在特定的其他模式中,在php中(或者可能在php regexp中使用?R来表示它的递归方面) )?

我的想法是想要匹配>内的标签。 {ThisSpace}<而不是在< {ThisSpace}>在一行可见的html文本中。

单行文本的示例是以下半个html和标签混合组合

<div {IgnoreThis} id="{AndIgnoreThisOne}">I want to be able to only get {TheBracketTagsWithin} the visible html areas, excluding title and textarea and any html tag similar to those tags </div {AlsoIgnoreThese}>

我已经尝试为此创建自己的正则表达式,但失败了..我可以使用php&amp;组合regexp,但遗漏了一些东西,或者没有在这里理解一些东西..

这是我正在尝试的regexp

(?<!\<\!--|\{|\<){([a-zA-Z0-9]*?)}(?!--\>|\}|\>)

这可以忽略div末尾的{AlsoIgnoreThese},因为下一个字符是&gt;,但我似乎无法以这样的方式修改这个正则表达式,直到它找到它为止。 / p>

我想知道这可能是需要DOM解析器的另一件事,我知道......“你不能使用RegExp制作HTML DOM解析,Newb!”......我明白了,所以这个问题我如何获得可见html中的{Tags}的匹配或角色位置或任何内容?并且没有DOM Parse告诉我有错误或没有给我任何响应,因为它破坏了HTML?

任何帮助都会受到赞赏,即使它只是指向了正确的方向。

谢谢!

- 编辑 -

我忘了提到的一点,因为这是一行html,可能并不总是html标签的结尾(它可能在未来的一行),相反可能并不总是一个开始标记或仅标记结束标记。对于没有开始或结束标记的行,我已经有一个解决方案,其中包含“在html空间内”或“在属性空间内”,因此可以安全地假设没有html开始或结束标记的任何行也应该捕获具有{BracketTag}的内容。

我觉得答案就在我的手指尖,但是解决它只是朝着正确的方向前进..

2 个答案:

答案 0 :(得分:0)

为什么不使用正则表达式搜索&gt; ...&lt;的每个实例,然后使用当前代码搜索每个匹配的代码?

编辑:尝试这样的事情:(?<=>)(?:.*?)(?<={)(.*?(?=}))(?:.*?)(?:.*?)(?=})(?:.*?)(?=<)

后视&gt;,然后非捕获组的所有内容到{,捕获所有内容到},非捕获所有内容到&lt;。我想你想给它一个全局修饰符来获得所有可能的结果。您必须将其转换为php

答案 1 :(得分:0)

$str = '<div {IgnoreThis} id="{AndIgnoreThisOne}">I want to be able to only get {TheBracketTagsWithin} the visible html areas, excluding title and textarea and any html {tag} similar to those {tags} </div {AlsoIgnoreThese}>';
$str = preg_replace("/<.*?>/", "", $str);
preg_match_all("/{.*?}/", $str, $matches);
foreach ($matches[0] as $match) echo $match . "\n";