Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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 preg_replace:删除所有2个字符单词&;以s结尾的3个字符_Php_Regex - Fatal编程技术网

PHP preg_replace:删除所有2个字符单词&;以s结尾的3个字符

PHP preg_replace:删除所有2个字符单词&;以s结尾的3个字符,php,regex,Php,Regex,很抱歉在RegEx问题上表现得很愚蠢,但我只是有一个问题: $search=trim(preg_replace('@[a-z]{1,2}s?@',''.$search') 据我所知,这应该删除所有小写2个字符的单词,以及任何以“s”结尾的小写3个字符的单词 不起作用的部分是它没有删除以“s”结尾的3个字符的小写单词 有什么想法吗 谢谢 见示例: 试试这个: $search=trim(preg_replace('/\b([a-z]{1,2}|[a-z]{2}s)\b/',' ',' '.$sear

很抱歉在RegEx问题上表现得很愚蠢,但我只是有一个问题:

$search=trim(preg_replace('@[a-z]{1,2}s?@',''.$search')

据我所知,这应该删除所有小写2个字符的单词,以及任何以“s”结尾的小写3个字符的单词

不起作用的部分是它没有删除以“s”结尾的3个字符的小写单词

有什么想法吗

谢谢

见示例: 试试这个:

$search=trim(preg_replace('/\b([a-z]{1,2}|[a-z]{2}s)\b/',' ',' '.$search.' '));
试试这个:

$search=trim(preg_replace('/\b([a-z]{1,2}|[a-z]{2}s)\b/',' ',' '.$search.' '));

如果要清理搜索字符串,可以将其分解:

$search_items = explode(' ', $search);
$search = ' ';
foreach ($search_items AS $search_item) {
  $search_item = trim($search_item);
  if (strlen($search_item) > 3 || (strlen($search_item) == 3 && substr($search_item,-1) != 's') {
    $search .= $search_item . ' ';
  }
}
对于正则表达式,我会尝试

$search=trim(preg_replace('@(\s)(\s+)?([a-z]{1,2}s?)(\s)@','$1',' '.$search.' '));

(\s)
在开头和结尾查找空白。第二对括号查找可以删除的其他空白。如果找到模式,字符串中只剩下第一个空格。

如果要清理搜索字符串,可以将其分解:

$search_items = explode(' ', $search);
$search = ' ';
foreach ($search_items AS $search_item) {
  $search_item = trim($search_item);
  if (strlen($search_item) > 3 || (strlen($search_item) == 3 && substr($search_item,-1) != 's') {
    $search .= $search_item . ' ';
  }
}
对于正则表达式,我会尝试

$search=trim(preg_replace('@(\s)(\s+)?([a-z]{1,2}s?)(\s)@','$1',' '.$search.' '));
(\s)
在开头和结尾查找空白。第二对括号查找可以删除的其他空白。如果找到模式,字符串中只剩下第一个空格。

这将修复它

$search=trim(preg_replace('@\b[a-z]{1,2}s?\b@','',$search));
$search=preg_replace('@\s+@',' ',$search);
谢谢大家的帮助。

这就解决了问题

$search=trim(preg_replace('@\b[a-z]{1,2}s?\b@','',$search));
$search=preg_replace('@\s+@',' ',$search);
谢谢大家的帮助。

试试这个:

它在这里


它在这里

希望这有帮助。

试试这个:

它在这里


它在这里


希望这有帮助。

In:
magic to feel In ses她
Out:
magic feel ses她
“ses”
后面出现的空格与
前面出现的空格相同。正则表达式引擎替换了“
中的“
”,但它会在空格后而不是之前继续搜索。很有趣。。。那么,解决这个问题的最佳选择是什么呢?谢谢AlphaMale的帮助。我已经通过结合我的代码和凯文建议的单词边界用法找到了答案。那么你应该接受合适的答案。In:
magic to feel In ses she
out:
magic feel ses she
在“
中出现在
”之后的空格与出现在
“ses”
之前的空格相同。正则表达式引擎替换了“
中的“
”,但它会在空格后而不是之前继续搜索。很有趣。。。那么,解决这个问题的最佳选择是什么呢?谢谢AlphaMale的帮助。我已经通过结合我的代码和Kevin建议的单词边界用法找到了答案。那么你应该接受合适的答案。这是可行的,除了还有很多多余的空格()。另外,
\b
部分做了什么?我在自己的代码中添加了单词边界,然后删除了双空格,这样就行了。所以+1。谢谢。这算是个不错的办法,不过还有很多多余的地方()。另外,
\b
部分做了什么?我在自己的代码中添加了单词边界,然后删除了双空格,这样就行了。所以+1。谢谢你。谢谢你的帮助,但实际上我正在努力避免这种情况。这将是很容易爆炸它,并检查每一个令牌,但这不是特别有效,这似乎对我来说。谢谢你的帮助,但实际上我正试图避免这一点。分解它并检查每个令牌是很容易的,但在我看来,这并不是特别有效。