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

PHP如何替换字符串中的确切单词

PHP如何替换字符串中的确切单词,php,replace,Php,Replace,我有这个php代码 $filename = "verbs.php"; // http://alylores.x10.mx/vega/verbs2.php $handle = fopen($filename, "r"); $verbs = fread($handle, filesize($filename)); fclose($handle); 我使用了PHPexplode()函数 将单词拆分为数组 $verbslist=explode(“,”,$verbs) 我还有一个字

我有这个php代码

 $filename = "verbs.php"; //  http://alylores.x10.mx/vega/verbs2.php  
 $handle = fopen($filename, "r");  
 $verbs = fread($handle, filesize($filename));  
 fclose($handle);
我使用了PHP
explode()
函数

将单词拆分为数组

$verbslist=explode(“,”,$verbs)

我还有一个字符串,比如:

$句子=“菲斯的狗在哪里?”

然后我使用
str_replace()
函数删除句子中的动词和一些特定单词,这样剩下的就只有主语了

$newsentence=str_replace($verbslist,“,$句子)

但结果是:

新句子:
Phz'dog?
//在
Phisz
上的
也被删除

我发现问题在于
Phisz
单词包含
is
,它也被
str_replace()
删除了

我想要的是如何在不影响其他单词的情况下删除句子中的单词/VEB。我的意思是删除确切的动词/单词。。。。。而且不区分大小写

预期的结果是这样的


新句子:
Phisz'dog?

使用像
/\bword\b/
这样的正则表达式将仅替换整个单词<代码>\b
表示单词边界。所以你可以这样做:

foreach ($verblist as &$verb) {
    $verb = '/\b' . preg_quote($verb, '/') . '\b/';
}

$newsentence = preg_replace($verblist, '', $sentence);
$newsentence = str_replace($verbslist,"",strtolower($sentence));

使用像
/\bword\b/
这样的正则表达式将仅替换整个单词<代码>\b
表示单词边界。所以你可以这样做:

foreach ($verblist as &$verb) {
    $verb = '/\b' . preg_quote($verb, '/') . '\b/';
}

$newsentence = preg_replace($verblist, '', $sentence);
$newsentence = str_replace($verbslist,"",strtolower($sentence));

因为你想删除确切的动词,你可以在每个动词周围加空格,所以你的列表应该是这样的,用u表示空格

" is "
" where "
等等

然后,为了不区分大小写,将所有动词的大小写改为小写,然后将动词包装在strtolower()中

因此,您的替换将如下所示:

foreach ($verblist as &$verb) {
    $verb = '/\b' . preg_quote($verb, '/') . '\b/';
}

$newsentence = preg_replace($verblist, '', $sentence);
$newsentence = str_replace($verbslist,"",strtolower($sentence));

因为你想删除确切的动词,你可以在每个动词周围加空格,所以你的列表应该是这样的,用u表示空格

" is "
" where "
等等

然后,为了不区分大小写,将所有动词的大小写改为小写,然后将动词包装在strtolower()中

因此,您的替换将如下所示:

foreach ($verblist as &$verb) {
    $verb = '/\b' . preg_quote($verb, '/') . '\b/';
}

$newsentence = preg_replace($verblist, '', $sentence);
$newsentence = str_replace($verbslist,"",strtolower($sentence));

如果一个单词包含元字符,您还需要在
$verb
上使用
preg_quote()
,先生,您的答案告诉了我重点。。。谢谢然而,我发现这也…$verbslist=str_replace(“,”,“|,$verbs)$pattern=“/\b”(.$verbslist.)\b/i”$newq2=preg_replace($pattern,“,$newq);不要忘记在
foreach
循环后取消($verb)
,以防止未定义的行为。如果单词包含元字符,您还想在
$verb
上使用
preg_quote()
,先生,您的答案告诉了我重点。。。谢谢然而,我发现这也…$verbslist=str_replace(“,”,“|,$verbs)$pattern=“/\b”(.$verbslist.)\b/i”$newq2=preg_replace($pattern,“,$newq);不要忘记在
foreach
循环之后取消设置($verb)
,以防止未定义的行为。先生。。。为什么我想找到一些自动的方法,因为这非常耗时。。。也不能保证它能正常工作。。因为。。。这不适用于第一个词和最后一个词。。。。我的详细列表很长,每一个都要加上空格…这会漏掉后面跟标点符号的动词,比如“谁在乎?”或“我喝酒,但我不是酒鬼。”先生。。。为什么我想找到一些自动的方法,因为这非常耗时。。。也不能保证它能正常工作。。因为。。。这不适用于第一个词和最后一个词。。。。我的详细列表很长,每一个都要加上空格……这会漏掉后面跟标点符号的动词,比如“谁在乎?”或“我喝酒,但我不是酒鬼。”