Php 匹配除子模式以外的任何内容

Php 匹配除子模式以外的任何内容,php,regex,parsing,Php,Regex,Parsing,我想完成这个(我相信是无效的)正则表达式试图做的事情: <p><a>([^(<\/a>)]+?)<\/a></p>uniquestring ([^()]+?)唯一字符串 基本上匹配除结束锚标记以外的任何内容。简单的非贪婪在这里没有帮助,因为“uniquestring”很可能位于另一个遥远的结束锚标记之后: <p><a>text I don't <tag>want</tag> to ma

我想完成这个(我相信是无效的)正则表达式试图做的事情:

<p><a>([^(<\/a>)]+?)<\/a></p>uniquestring
([^()]+?)

唯一字符串
基本上匹配除结束锚标记以外的任何内容。简单的非贪婪在这里没有帮助,因为“uniquestring”很可能位于另一个遥远的结束锚标记之后:

<p><a>text I don't <tag>want</tag> to match</a></p>random 
data<p><a>text I do <tag>want to</tag> match</a></p>uniquestring more
matches <p><a>of <tag>text I do</tag> want to match</a></p>uniquestring 
我不想匹配的文本
数据我确实希望匹配的文本

唯一字符串更多 匹配我想要匹配的文本的

唯一字符串
所以我在锚标签之间有更多的标签。我使用
uniquestring
来确定是否要匹配数据。因此,一个简单的非贪婪最终匹配了从我不想要的数据开始到我想要的数据结束的所有内容

我知道我正在接近正则表达式(或者至少我对它们的了解)不擅长解决的问题。我可以在HTML/XML解析器中浏览数据,但这只是一个简单的(ish)搜索


有什么简单的方法可以做到这一点,我只是错过了?

您正在寻找零宽度负片查看后面:

<p><a>((?<!<\/a>).)+<\/a><\/p>uniquestring
(?)+唯一字符串
测试:

(zyx:~)%echo$T
我不想匹配的文本

随机数据我想匹配的文本

uniquestring更多我想匹配的文本

uniquestring (zyx:~)%echo$T | grep-oP'(?)+uniquestring' 我确实要匹配的文本

uniquestring 我要匹配的文本的数量

uniquestring
事实上,这正是我想要的!我几乎能理解。:-)我会用向前看,而不是向后看。按照您的方式,它必须在意识到它不应该匹配它之前通过
序列<代码>(?!)在第一个字符处停止匹配。
(zyx:~) % echo $T
<p><a>text I don't <tag>want</tag> to match</a></p>random  data<p><a>text I do <tag>want to</tag> match</a></p>uniquestring more matches <p><a>of <tag>text I do</tag> want to match</a></p>uniquestring
(zyx:~) % echo $T | grep -oP '<p><a>((?<!<\/a>).)+<\/a><\/p>uniquestring'
<p><a>text I do <tag>want to</tag> match</a></p>uniquestring
<p><a>of <tag>text I do</tag> want to match</a></p>uniquestring