PHP正则表达式不匹配字符串中的文本
我有像PHP正则表达式不匹配字符串中的文本,php,regex,Php,Regex,我有像foo=='bar test baz'和test.asd=“buz foo”这样的内容。我需要匹配“标识符”,左边不在双引号/单引号内的标识符。这就是我现在拥有的: preg_replace_callback('#([a-zA-Z\\.]+)#', function($matches) { var_dump($matches); }, $subject); 现在它甚至可以匹配字符串中的那些。我怎么写一个与字符串不匹配的呢 另一个例子:foo==5和bar!='buz'或fuz==
foo=='bar test baz'
和test.asd=“buz foo”
这样的内容。我需要匹配“标识符”,左边不在双引号/单引号内的标识符。这就是我现在拥有的:
preg_replace_callback('#([a-zA-Z\\.]+)#', function($matches) {
var_dump($matches);
}, $subject);
现在它甚至可以匹配字符串中的那些。我怎么写一个与字符串不匹配的呢
另一个例子:foo==5和bar!='buz'或fuz=='foo bar fuz luz'
。所以本质上,匹配不在字符串内的a-zA-Z
/^[^'"=]*/
我会用你的例子。它匹配任意数量的字符(从字符串开头开始),这些字符既不是引号也不是等号
/^[^'"=\s]*/
此外,还避免了匹配空白,这可能是您所需要的,也可能不是您所需要的
编辑:
你问的是如何匹配文本中引用部分以外的字母(可能还有点?)。这更复杂。能够正确识别当前是否在引号字符串之外的正则表达式(通过确保引号的数量(不包括转义引号和嵌套引号)为偶数)与PHP正则表达式类似:
'/(?:
(?= # Assert even number of (relevant) single quotes, looking ahead:
(?:
(?:\\\\.|"(?:\\\\.|[^"\\\\])*"|[^\\\\\'"])*
\'
(?:\\\\.|"(?:\\\\.|[^"\'\\\\])*"|[^\\\\\'])*
\'
)*
(?:\\\\.|"(?:\\\\.|[^"\\\\])*"|[^\\\\\'])*
$
)
(?= # Assert even number of (relevant) double quotes, looking ahead:
(?:
(?:\\\\.|\'(?:\\\\.|[^\'\\\\])*\'|[^\\\\\'"])*
"
(?:\\\\.|\'(?:\\\\.|[^\'"\\\\])*\'|[^\\\\"])*
"
)*
(?:\\\\.|\'(?:\\\\.|[^\'\\\\])*\'|[^\\\\"])*
$
)
([A-Za-z.]+) # Match ASCII letters/dots
)+/x'
可以找到一个解释。但是,正则表达式可能不是用于此目的的合适工具。您也可以尝试以下方法:
preg_match_all('/[\w.]+(?=(?:[^\'"]|[\'"][^\'"]*["\'])*$)/', $subject, $result, PREG_PATTERN_ORDER);
for ($i = 0; $i < count($result[0]); $i++) {
# Matched text = $result[0][$i];
}
preg\u match\u all('/[\w.]+(?=(?:[^\'”]|[\'”][^\'”]*[“\'])*$)/',$subject,$result,preg\u PATTERN\u ORDER);
对于($i=0;$i
要匹配引号外的所有字母、数字和
以及点。您可以通过将允许的字符添加到[\w.]
中来扩展它们。我在这里使用的技巧是,每当遇到引号时,强制正则表达式进行分支,然后稍后我们忽略此分支
$subject = <<<END
foo == 'bar test baz' and test.asd = "buz foo"
foo == 5 AND bar != 'buz' OR fuz == 'foo bar fuz luz'
END;
$regexp = '/(?:["\'][^"\']+["\']|([a-zA-Z\\.]+\b))/';
preg_replace_callback($regexp, function($matches) {;
if( count($matches) >= 2 ) {
print trim($matches[1]).' ';
}
}, $subject);
// Output: 'foo and test.asd foo AND bar OR fuz '
为什么不分解(“=”,$subject)代码>?@k102:没那么简单。我不能把每一个可能的变化都编出来,但这个主题在结构上可能会有很大的变化。例如:
foo='bar'和baz='foo'
。如果我太不精确,请原谅。我认为这与我在问题中补充的情况不完全相符?或者我不完全理解正则表达式,但从外观上看,它假设除了a-z和引号之外没有字符?我修改了答案,只匹配a-zA-z的大小写。询问您是否不清楚regexp。您有什么想法可以在问题中刚刚添加的示例中使用吗?@rFactor您编辑的问题不清楚。还请提供所需的输出。这有点困难,特别是因为引号可以转义或包含其他引号,如“2\”乘4\”
,“不”
等等。我正在进行preg\u replace\u回调,因为我需要替换那些匹配项。如果我只是做了一个匹配,我怎么知道我正在替换正确的内容(例如,foo='foo'
应该匹配第一个foo
,并用我的自定义内容替换它,但它不应该影响字符串中的内容)?@rFactor您可以将相同的正则表达式与preg\u replace\u回调一起使用。问题的关键是,对于你们编辑过的问题,我不清楚你们想要捕捉哪些角色。
(?: anything between quotes | any word consisting of a-zA-Z )