在字符串中搜索模式中的字母数字字符

时间:2012-08-18 22:58:54

标签: php string pattern-matching alpha numeric

我有一个包含5个单词的字符串。在字符串中,其中一个词是Ham Radio Call Sign,可以是美国数千个呼号的任何一个。为了从字符串中提取呼号,我需要使用以下模式。我需要提取的呼号可以在字符串中的5个位置中的任何一个。该数字永远不是第一个字符,数字永远不是最后一个字符。该字符串实际上是从一个数组放在一起的,因为它最初是从文本文件中读取的。

$string = $word[1] $word[2] $word[3] etc.... 

因此搜索可以在整个字符串或每个数组上完成。

Patterns:
1 Number and 3 Letters Example: AB4C A4BC
1 Number and 4 Letters Example: A4BCD
1 Number and 5 Letters Example: AB4CDE

我已经尝试了所有我能想到的东西并进行搜索,直到我再也找不到了。我相信我在想这个。

2 个答案:

答案 0 :(得分:0)

这取决于其他单词可以包含的内容,但您可以使用正则表达式,如:

#\b[a-z]+\d[a-z]+\b#i
                    ^ case insensitive
                 ^^ a word boundary
           ^^^^^^ One or more letters
         ^^ One number

您可以使用{1,3}代替+来使字母更具限制性,以便您拥有1到3个字母的序列。

完整的表达式如下:

$success = preg_match('#\b[a-z]+\d[a-z]+\b#i', $input_string, $matches);

其中$matches[0]将包含匹配的值,请参阅manual

答案 1 :(得分:0)

像这样的两步正则表达式会这样做:

$str = "hello A4AB there BC5AD";
$signs = array();
preg_match_all('/[A-Z][A-Z\d]{1,3}[A-Z]/', $str, $possible_signs);
foreach($possible_signs[0] as $possible_sign)
    if (preg_match('/^\D+\d\D+$/', $possible_sign))
        array_push($signs, $possible_sign);

print_r($signs); //Array ([0] => A4AB [1] => BC5AD)

<强>解释

这是一种使用两种模式的正则表达式方法。我不认为它可以用一个完成,仍然满足匹配规则的确切要求。

第一种模式强制执行以下要求:

  • substring以大写字母开头和结尾
  • substring只包含第一个和最后一个字母之间的其他大写字母或数字
  • substring总体上不超过6个字符

不能以同样的方式做什么,由于复杂的REGEX原因,我不会进入(除非有人知道并且可以纠正我),强制只有一个数字是含有。

@ jeroen的回答 以单一模式强制执行此操作,但反过来强制执行子字符串的正确长度。无论哪种方式,我们都需要第二种模式。

所以在抓住初始匹配后,我们循环结果。然后,我们将每个模式应用于第二个模式,该模式仅强制执行子字符串中只有一个数字。

如果是这样,我们对子字符串进行绿灯处理,并将其添加到$signs数组中。

希望这有帮助。