【问题标题】:regex pattern to match only strings that don't contain spaces PHP正则表达式模式仅匹配不包含空格的字符串 PHP
【发布时间】:2010-06-03 04:05:25
【问题描述】:

我想匹配变量中包含的单词/模式,但只匹配没有空格的单词。请提出建议。

$var = '看';

$array = ('look', 'greatlook', 'lookgreat'、'look great'、'badlook'、 '看起来不好','看起来','看起来');

匹配单词:look、greatlook、lookgreat、badlook

不匹配:看起来很棒,看起来很糟糕,看起来(尾随空格),(空格)看起来。

以下函数的语法没问题,但它匹配一切

$match = preg_grep("/$var/", $array);

$match = preg_grep ("/^$var/", $数组); (匹配开头带有“look”的单词)

但是当我包含 [^\s] 时,它给出了一个错误

$match = preg_grep("/$var[^\s]/", $array);

解析错误:语法错误,意外的 '^',需要 T_STRING 或 T_VARIABLE

TIA

【问题讨论】:

  • 如果您的文字可能包含标点符号,请务必使用 $varpreg_quote
  • look greatlook 怎么样?那是一场比赛吗?
  • @polygenelubricants。不,我不想在匹配值中有空格
  • +1 用于询问正则表达式问题,其中包含您希望匹配或拒绝的字符串列表。

标签: php regex


【解决方案1】:

正则表达式为^(?=.*look)[^\s]+$

preg_match("/^(?=.*{$var})[^\\s]+$/", $str);

<?
  $str = array('look', 'greatlook', 'lookgreat', 'look great', 'badlook', 'look bad', 'look ', ' look');
  $var = "look";
  $matches = preg_grep("/^(?=.*{$var})[^\\s]+$/", $str);
  print_r ($matches);
?>
//output
Array
(
    [0] => look
    [1] => greatlook
    [2] => lookgreat
    [4] => badlook
)

【讨论】:

  • 谢谢,但这不起作用,[^\\s] 中的额外 \ 会给出错误,即使没有额外的斜杠,正则表达式仍然会导致多个错误,主要是由于改变了结构$var 的模式。
  • @jamex 怎么样"^(?=.*look)[^\\s]+$"
  • 这也不起作用,“preg_grep() [function.preg-grep]: Unknown modifier '\' in”。即使删除了其中一个\,它仍然显示相同的错误。
  • 感谢您的努力,抱歉我没有发现错误。语法不熟,来晚了。
【解决方案2】:

用途:

$match = preg_grep("/^\S*$var\S*$/", $array);

【讨论】:

  • 非常感谢,这行得通。我还删除了表达式前面的 \S* 以强制仅以 'look' 作为起始字符进行匹配。你能解释一下 $ 前面的 \ 是做什么用的吗?我没有搜索,但我不认为 \ 作为 $(字符串结尾)的要求。
  • @Jamex,实际上,它可以在这里工作。我担心 $ 会被解释为 PHP 变量 sigil
  • 实际上,您的原始解决方案对我有用,“/^\S*$var\S*$/”。我只是出于另一个目的删除了表达式的起始部分。很抱歉回复的晦涩,来晚了。
【解决方案3】:
$match = preg_grep ("/{$var}[^\s]/", $array);

我认为您需要将变量括在大括号中,因为字符会在没有空格的情况下继续。

【讨论】:

  • 这意味着下一个字符不是空格。 “looka”仍然匹配。此外,以 $var 结尾的单词(包括外观)不会,因为没有下一个字符。
  • 谢谢,但这不起作用,大括号改变了模式。
猜你喜欢
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多