我有一个包含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
我已经尝试了所有我能想到的东西并进行搜索,直到我再也找不到了。我相信我在想这个。
答案 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)
<强>解释强>
这是一种使用两种模式的正则表达式方法。我不认为它可以用一个完成,仍然满足匹配规则的确切要求。
第一种模式强制执行以下要求:
我不能以同样的方式做什么,由于复杂的REGEX原因,我不会进入(除非有人知道并且可以纠正我),强制只有一个数字是含有。
@ jeroen的回答
所以在抓住初始匹配后,我们循环结果。然后,我们将每个模式应用于第二个模式,该模式仅强制执行子字符串中只有一个数字。
如果是这样,我们对子字符串进行绿灯处理,并将其添加到$signs
数组中。
希望这有帮助。