Php 正则表达式来检测不在{}之间的所有内容,然后从匹配的内容中搜索

Php 正则表达式来检测不在{}之间的所有内容,然后从匹配的内容中搜索,php,regex,Php,Regex,我对stackoverflow和正则表达式都是新手,所以请原谅我的错误 我一直在彻底搜索正则表达式,以匹配所有不在花括号{}之间的文本,并从该文本中找到某些单词。例如,从以下字符串: $content='helloworld,{this}是一个带有{花括号}的字符串,用于测试' 我希望搜索单词this时只返回第二个出现的this,因为它位于不在花括号内的区域。 即使我可以得到一个正则表达式来匹配花括号外的子字符串,事情对我来说也变得简单了。我发现这个正则表达式/(}([^}]*){,但它不能选择

我对stackoverflow和正则表达式都是新手,所以请原谅我的错误

我一直在彻底搜索正则表达式,以匹配所有不在花括号{}之间的文本,并从该文本中找到某些单词。例如,从以下字符串:

$content='helloworld,{this}是一个带有{花括号}的字符串,用于测试'

我希望搜索单词
this
时只返回第二个出现的
this
,因为它位于不在花括号内的区域。 即使我可以得到一个正则表达式来匹配花括号外的子字符串,事情对我来说也变得简单了。我发现这个正则表达式
/(}([^}]*){
,但它不能选择部分
Hello world、
,这是用于测试的,因为它们不在
}{
内,它只选择
是一个带有
部分的字符串

另外,我想问一下,是否有可能将两个正则表达式组合为一个单一的用途,例如,第一个正则表达式查找
{}
之外的字符串,第二个正则表达式查找要搜索的特定单词

我想在php中使用这个正则表达式,现在我使用的是一个更像黑客的函数。目的是查找不在
{}
中的特定单词,可靠地替换它们并写入文本文件

提前感谢您的帮助。

(*SKIP)(*F)

您很幸运,因为php的PCRE正则表达式引擎的语法非常适合此类任务。这个整洁的正则表达式非常有魅力(请参阅):

好的,但它是如何工作的?

很高兴您这么问。交替的左侧与完整的
{brates}匹配
然后故意失败,之后引擎跳转到字符串中的下一个位置。右侧匹配所需的
这个
单词,我们知道它们是正确的,因为它们与左侧的表达式不匹配

如何在PHP中使用它

就像往常一样,比如:

$regex = "~{[^{}]*}(*SKIP)(*F)|\bthis\b~";
$count = preg_match_all($regex,$string,$matches);
您需要查看
$matches[0]

进一步阅读此排除技术和类似排除技术


这种情况与这个问题非常相似,如果您对
(*SKIP)
power感兴趣并喜欢它,您可能需要阅读以完全理解该技术以及如何扩展它。

对于长度不太长的字符串,我会使用简单的字符串操作函数来实现这些搜索

$content = 'Hello world, { this } is a string with { curly brackets } and this is for testing';

function searchify($stack,$charStart='{',$charEnd='}') {
  $searchArea = '';
  $first = explode($charStart,$stack);
  foreach ($first as $string) {
    list($void,$ok) = (strpos($string,$charEnd) ? explode($charEnd,$string) : array('',$string));
    $searchArea.= $ok;
  }
  return $searchArea;
}
这将返回一个清除的字符串,然后strtr

$replacing = array
 ('with'=>'this',
  "\n"=>'<br>',
  '  '=>"<br>",);
$raw = searchify($content);
$replaced = strtr($raw,$replacing);
var_dump($replaced);
$replacement=array
(‘with’=>‘this’,
“\n”=>“
”, ''=>“
”,); $raw=searchify($content); $replacement=strtr($raw,$replacement); var_dump(已更换);

…以替换其中的值。

这非常有效。我知道必须有类似(*SKIP)(*F)的内容但我只是不知道。奇怪的是,关于stackoverflow还没有类似的问题。至少我找不到一个。Thanks@Shark谢谢你,很高兴你喜欢它!)嘿,顺便说一下,我注意到你还没有投票给StActPoad。对于任何你觉得有用的答案,请考虑投票,因为这是信誉系统如何运作。当然,没有义务!谢谢!听我的10秒SO rep教程。:@Shark顺便说一句,你会发现使用这种技术的其他SO问题,但是的,可能不在谷歌的顶端。对于完整的故事,我建议你看一看,或者留到以后,我写答案时很有乐趣。:@Shark你现在有18个SO rep,你可能正在去月球的路上。:)w这是一个很好的问题,不是一个罕见的问题,但我特别喜欢你自己做了一次公平的尝试。感谢你在心中的支持,这太棒了。希望有机会再次见到你。:)答案解释得很好!顺便说一下“正则表达式匹配…除非…”是指regex101吗?它不应该指哪一个确实很好,以及我从哪里学到的欢呼:]我今天晚些时候会尝试你的答案。我想知道哪一个更快,带有Preg_replace()的Regex,或者您使用str_replace的函数?正如我在问题中提到的,我的目的是在长字符串中对所有此类匹配进行替换。使用\bword\b进行分词并放入preg_replace的正则表达式似乎是完美的,因为它是一个单行解决方案。我相信最快的可能是正则表达式,尽管这很容易实现。y的长度是多少我们的字符串?字符串的长度大约与我的问题相同或更多。为此,我更新并完成了该字符串,但现在我觉得我错误地理解了你问题的某些部分;剩余字符串必须仍然包含括号之间的原始字符。。。
$replacing = array
 ('with'=>'this',
  "\n"=>'<br>',
  '  '=>"<br>",);
$raw = searchify($content);
$replaced = strtr($raw,$replacing);
var_dump($replaced);