Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 不要选择双方括号之间的任何文本_Php_Regex_Pcre - Fatal编程技术网

Php 不要选择双方括号之间的任何文本

Php 不要选择双方括号之间的任何文本,php,regex,pcre,Php,Regex,Pcre,我需要编写一个正则表达式,根据模式匹配某些内容(这是可行的),但如果文本位于双方括号内的任何位置,它就不应该匹配它。 实际问题是,反向查找不能是可变长度的 情况是: 有一本短语词典 单词较多的短语比单词较短的短语“更强” 有些短语是其他较长短语的一部分 示例字典(按实数代码中的数组排序): 要分析的文本示例: Lorem ipsum Wooden House dolor sit amet 解析是通过preg_replace对要解析的文本进行的,通过迭代字典并添加[[randomstaff-

我需要编写一个正则表达式,根据模式匹配某些内容(这是可行的),但如果文本位于双方括号内的任何位置,它就不应该匹配它。 实际问题是,反向查找不能是可变长度的

情况是:

  • 有一本短语词典
  • 单词较多的短语比单词较短的短语“更强”
  • 有些短语是其他较长短语的一部分
示例字典(按实数代码中的数组排序):

要分析的文本示例:

Lorem ipsum Wooden House dolor sit amet
解析是通过preg_replace对要解析的文本进行的,通过迭代字典并添加
[[randomstaff-u-当前字典短语]]
,例如:

Lorem ipsum Woody House Door sit amet
->
Lorem ipsum[[randomstuff-\uuu-Woody House]]Door sit amet

目前,在第二次迭代之后,它变成:
Lorem ipsum[[randomstuff-\uuu-木屋]]dolor sit amet
->
Lorem ipsum[[randomstuff-\uuu-木屋]]]

如果它已经在
[[
]
之间,我希望它保持不变

所以基本上,如果匹配是
[[
]
之间的任何地方,则忽略它

$dictPhrases = ["Wooden House", "House", "Wooden"];
$TEXT = "Lorem ipsum Wooden House dolor sit amet";

for ($dictPhrases as $phrase){
 $phraseOccurences = 0; //irrelevant in this example
 $TEXT = preg_replace("/(?i)(?<= |^|\n)(" . $phrase. "[&()'-]{0,1})(?= |$|\.|\,)/", "[[$randomstuff-_-" . $phrase . "]]", $TEXT, -1, $phraseOccurences);

}
$dictPhrases=[“木屋”、“木屋”、“木屋”];
$TEXT=“Lorem ipsum Woody House dolor sit amet”;
对于($短语作为$短语){
$phraseOccurrences=0;//在本例中不相关
$TEXT=preg_replace(“/(?i)(?仅转换

["Wooden House", "House", "Wooden"]
转换为单个正则表达式:

"(?:Wooden House|House|Wooden)"
然后把它放到主正则表达式中

试试这样的方法:

$dictPhrases = ["Wooden House", "House", "Wooden"];
$TEXT = "Lorem ipsum Wooden House dolor sit amet";

$pattern = "/(?i)(?<= |^|\n)((?:" . join('|', $dictPhrases) . ")[&()'-]{0,1})(?= |$|\.|\,)/";

$phraseOccurences = preg_match_all($pattern, $TEXT);
$TEXT = preg_replace($pattern, "[[$randomstuff-_-$1]]", $TEXT);
$dictPhrases=[“木屋”、“木屋”、“木屋”];
$TEXT=“Lorem ipsum Woody House dolor sit amet”;

$pattern=“/(?i)(?可能有两种解决方案

1) 获取匹配的起始位置,找到子字符串中的所有“[[”和“]]”(0,匹配的第一个字符),并将它们修改为2。 2) 获取匹配的起始位置,获取子字符串中“[]”的最后位置和“]]”的最后位置(0,匹配的第一个字符),并检查哪个更接近

两者都应该在括号不能嵌套的假设下工作(在这种特殊情况下也是如此)。 不幸的是,所需的代码没有regex功能


我将在周一尝试实现它,并为未来的搜索者发布最终代码-如果它能像ofc预期的那样工作。

也许你的想法是错误的……尝试将第一次迭代分成不同的部分。然后在第二次迭代中,你可以用第一次迭代的部分操作第二次迭代中的字符串。例如,迭代中的短语可以用来替换字符串(短语ONE,,$secondIteration);然后对字符串中留给第二次迭代的部分处理正则表达式。一旦处理完毕,将其分解,并按照第二次处理的方式处理第三次。重复操作直到完成。最后将所有内容重新映射到一起。您的代码不会执行您描述的操作,因为只有在有选择的情况下才会进行替换
&()'-
和强制性的“$\.\”,`跟随短语,
House
后跟
]
在第二次迭代中不会被替换。您应该将代码与您的描述对齐。@Armali正面和正面都有空格(lookback和lookahead)。
(?我很清楚空格,这与我写的内容无关。尝试一下你发布的代码,你会发现它与你描述的不一样。不幸的是不适用。这样我就无法将该随机部分与特定词典条目匹配-它是for循环外的:/但是我会尝试将它与预生成随机部分的assoc数组一起使用键和dict项作为值。如果可以的话,我会发布代码。
["Wooden House", "House", "Wooden"]
"(?:Wooden House|House|Wooden)"
$dictPhrases = ["Wooden House", "House", "Wooden"];
$TEXT = "Lorem ipsum Wooden House dolor sit amet";

$pattern = "/(?i)(?<= |^|\n)((?:" . join('|', $dictPhrases) . ")[&()'-]{0,1})(?= |$|\.|\,)/";

$phraseOccurences = preg_match_all($pattern, $TEXT);
$TEXT = preg_replace($pattern, "[[$randomstuff-_-$1]]", $TEXT);