正则表达式不应该匹配某个数字


Regular expression shouldn't match a certain number

我想匹配这样的每个字符串

<img src="whatever" whatever alt="whatever" whatever height="any number but not 162" whatever />
换句话说,我想匹配在"link"之后包含除数字162(整个数字,而不仅仅是单个字符)之外的所有字符串。我用这个
function embed($strr) {
    $strr = preg_replace('@<img.*src="([^"]+)"(?:[^1]+|1(?:$|[^6]|6(?:$|[^2]))) />@is', '[img]$1[/img]', $strr);
 return $strr;
}

但是它不匹配包含1而不是162的所有内容。怎么解?

除了正则表达式,还可以使用XPath, XPath是专门为从结构化标记文档中提取信息而设计的。要获取文档中不包含162的高度属性的所有img节点,您可以使用

//img[not(contains(@height, 162))]

,我个人认为它比正则表达式更容易阅读。假设你不想要固定高度为162的img节点,而不是所有在属性中有162的节点,例如2162或1623等,你可以只执行

//img[@height != 162]
有多种XML/HTML解析器允许您使用XPath。要查看合适的列表,请参见
    解析HTML的最佳方法

你可以使用像这样的反向向前看

height="(?!162)([^"]+)

在Regexr上查看

(?!162)是一个负向前看,它确保"162"不在这个位置后面,但它不匹配它。

我不确定你到底想要匹配什么,但我想你已经明白了。