搜索带有感叹号的第一个单词的字符串

时间:2016-03-28 16:18:58

标签: php regex

我有一个这样的字符串:

filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='red', endColorstr='yellow',GradientType=0 );

我想获取第一个单词,后跟一个感叹号。所以在上面的例子中,它应该是:

$string = 'Hello k-on! Lorem Ipsum! Lorem.';

我迷失了什么是合适的方法。也许正则表达式解决方案?

3 个答案:

答案 0 :(得分:1)

如果您只需要支持ASCII字母单词,可以使用

/\b[a-z]+(?:-[a-z]+)*!/i

请参阅regex demo

如果您打算支持Unicode,请使用\p{L}

/\b\p{L}+(?:-\p{L}+)*!/u

请参阅another regex demo

以下是模式说明:

  • \b - 单词边界(前一个字符必须是非单词或字符串的开头)
  • \p{L}+ - 一个或多个Unicode字符(如果使用[a-zA-Z],则为ASCII)
  • (?:-\p{L}+)* - 零个或多个序列:
    • - - 字面连字符
    • \p{L}+ - 一个或多个Unicode字符(如果使用[a-zA-Z],则为ASCII)
  • ! - 文字!符号

PHP demo

$re = '/\b\p{L}+(?:-\p{L}+)*!/u'; 
$str = "Hello k-ąn! Lorem Ipsum! Lorem.";
preg_match($re, $str, $match);
print_r($match);

答案 1 :(得分:0)

我认为这可能会做你想要的。基本上将字符串拆分为单词,查找以'!'结尾的第一个单词,然后执行任何操作,然后突破循环:

$string = 'Hello k-on! Lorem Ipsum! Lorem.';
arry = explode(" ", $string);
foreach ($arry as $word) {
   if (substr($word,-1) == "!") {
      do something ...
      break;
   }
}

答案 2 :(得分:0)

$string = 'Hello k-on! Lorem Ipsum! Lorem.';
preg_match('/[A-Za-z0-9-]+!/', $string, $match);
$yourWord   = str_replace("!", "", $match[0]); //prints k-on

显然,需求的解决方案是RegExp,这里我使用了一个允许AlphaNumeric String的简单表达式,特别允许连字符( - )。 preg_match的使用将模式匹配到字符串中并返回第一个匹配关键字,在您的情况下为k-on!并使用str_replace以便从返回的字符串中取出感叹号。 / p>

了解preg_matchhttp://php.net/manual/en/function.preg-match.php

的更多信息