Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.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_Replace_Expression - Fatal编程技术网

PHP正则表达式匹配字符串中不包括一个特定单词的单词

PHP正则表达式匹配字符串中不包括一个特定单词的单词,php,regex,replace,expression,Php,Regex,Replace,Expression,我有一个文本($txt),一个单词数组($words),我想添加一个链接和一个不能被替换的单词($wordToExclude) $words = array ('adipiscing','molestie','fringilla'); $wordToExclude = 'consectetur adipiscing'; $txt = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque mattis tincidu

我有一个文本($txt),一个单词数组($words),我想添加一个链接和一个不能被替换的单词($wordToExclude)

$words = array ('adipiscing','molestie','fringilla');
$wordToExclude = 'consectetur adipiscing';


$txt = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque
mattis tincidunt dolor sed consequat. Sed rutrum, mauris convallis bibendum 
dignissim, ligula sem molestie massa, vitae condimentum neque sem non tellus.
Aenean dolor enim, cursus vel sodales ac, condimentum ac erat. Quisque
lobortis libero nec arcu fringilla imperdiet. Pellentesque commodo, 
arcu et dictum tincidunt, ipsum elit molestie ipsum, ut ultricies nisl
neque in velit. Curabitur luctus dui id urna consequat vitae mattis
turpis pretium. Donec nec adipiscing velit.'
我想得到这个结果:

$txt = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque
mattis tincidunt dolor sed consequat. Sed rutrum, mauris convallis bibendum 
dignissim, ligula sem <a href="#">molestie</a> massa, vitae condimentum neque sem non tellus.
Aenean dolor enim, cursus vel sodales ac, condimentum ac erat. Quisque
lobortis libero nec arcu <a href="#">fringilla</a> imperdiet. Pellentesque commodo, 
arcu et dictum tincidunt, ipsum elit <a href="#">molestie</a> ipsum, ut ultricies nisl
neque in velit. Curabitur luctus dui id urna consequat vitae mattis
turpis pretium. Donec nec <a href="#">adipiscing</a> velit.'
$txt='Lorem ipsum door sit amet,Concetetur adipiscing Elite。奎斯克
马蒂斯·廷西德蒙·多洛·塞德·康塞卡特。红葡萄酒
尊严、舌苔和马萨,vitae调味品和非tellus。
埃尼安·多洛·埃尼姆,苏打水,调味品。奎斯克
lobortis libero nec arcu饮食。佩伦茨克康茂多,
这句话的主旨是,公共部门的精英是公共部门的精英,而不是其他部门的精英
维利特的内克。马蒂斯生活酒店
杜松子。“别这样。”
$result=preg\u replace(
'/\b#单词边界
(#匹配以下选项之一:

(?Okie doke!虽然我认为这在技术上是可行的,但我提供的解决方案在这一点上有点软:

s%(?!consectetur adipiscing)(adipiscing|molestie|fringilla)(?<!consectetur adipiscing)%<a href="#LinkBasedUpon$1">$1</a>%s
s%(?!concetetur adipsing)(adipsing | molestie | fringilla)(?)?
变成

坐在阿梅特的位子上,向精英致敬。奎斯克…利古拉semmolestiemassa…nec arcufringillaImpremedite…necAdipisingvelit

进入

坐在阿梅特,继续向精英致敬。奎斯克…利古拉sem
马萨…nec arcu
维利特

它之所以是一种软解决方案,是因为它不处理部分单词或其他情况,其中要排除的单词既不以要匹配的单词开头也不以要匹配的单词结尾。例如,如果我们要附加到被排除的“单词”(即
连续adipising elit
),此表达式将最终与
连续adipising elit
中的
adipising
匹配,因为
adipising
的开头或结尾与
连续adipising elit
的开头或结尾不相同

只要您的排除“单词”(
abc
)总是以要查找的单词之一结尾或开始(
C | X | E
中有一个
C
,并且
abc
C
结尾,它就应该工作,…)

编辑{

“不匹配”字必须以匹配字之一开头或结尾的原因是,此解决方案在匹配前使用负向前看,在匹配后使用负向后看,以确保匹配序列与不匹配字不匹配(这有意义吗?)

}


对此有一些解决方案,但它们要么是处理器和编程工作密集型的,要么是处理器和编程工作密集型的,而且根据单词列表的大小、搜索文本的长度和具体要求,它们的强度会成倍增加——而且您从未指定过任何其他内容,所以我现在不打算讨论。让我知道我f这对于您的情况来说已经足够好了!

我知道您正在用PHP进行操作。我知道您需要在文本中找到一个单词数组,您需要用链接来替换这些单词。此外,在进行替换时,您需要排除一个字符串。也许您不需要编写既酷又干净而又复杂的正则表达式,那么这个pr呢实际的,尽管可能不是最好的解决方案:

将任务拆分为子任务:

  • 使用preg_match_all查找排除字符串的所有匹配项的偏移量(您知道字符串长度(
    strlen
    ),并使用
    preg_OFFSET_CAPTURE
    标记查找
    preg_match_all
    的精确起点和终点-如果有多个起点和终点)
  • 在单词列表中进行foreach,然后再次使用
    preg\u match\u all
    获取所有需要替换为链接的单词
  • 将第2步中找到的位置与第1步中找到的位置进行比较,如果它们在外部,则在重叠时进行更换或跳过

  • 这肯定不会是一行,但很容易编写代码,以后可能也很容易阅读。

    你需要给我们一个简短的例子;阅读所有那些假拉丁语会让我的眼睛受伤。@TimPietzcker他是怎么说的?我读它的方式是:“我想用链接替换这些单词,只要这些单词不在$wordsToExclude中",将$wordsToExclude视为$wordsToExclude是没有意义的redudant@TimPietzcker现在我看到了…我的bad@TimPietzcker这个例子可以简单得多,也可以复杂得多:
    $wordsToExclude
    是否也可以包含类似于
    adipising elit
    arcu flingilla imperdiet
    ?部分单词?等内容。你说得对,t他现在的规范很模糊。我认为他正在尝试构建一个包含3个参数、文本、单词数组和一个要排除的单词的函数。他希望函数替换单词数组中的所有单词,但排除文本中的一种类型的组合。因此使用他的变量应该是通用的。@inTide:是的。规范模糊,水晶球破碎。
    s%(?!consectetur adipiscing)(adipiscing|molestie|fringilla)(?<!consectetur adipiscing)%<a href="#LinkBasedUpon$1">$1</a>%s