0

您好,我不擅长正则表达式,如果有人能帮助我,我将不胜感激。我需要一个正则表达式函数,它可以找到所有以 : 开头的模式,后跟至少 1 个字母,可能还有数字,直到下一次出现符号。

例如 :hi/:Username@asdfasfasdf:asfs,asdfasfasfs:asdf424/asdfas

如您所见,这里有 4 次出现。我想要实现的是最终得到一个包含以下内容的数组:

['hi','Username','asfs','asdf424']

PS。字母可能是英语以外的其他语言。

无缘无故投反对票...恭喜

这是我到目前为止使用的,但我想使用正则表达式会更容易

public function decodeRequest() {

    $req_parts = $this->getRequestParams(); // <-array of strings


    $params = array();

    for ($i=0; $i < count($req_parts); $i++) {

        $starts = mb_substr($req_parts[$i], 0, 1, 'utf-8');
        $remains = mb_substr($req_parts[$i], 0, mb_strlen($req_parts[$i]), 'utf-8');

        if ($req_parts[$i] == ':') {
            array_push($params,$remains);
        }


    }

    return $params;

}
4

2 回答 2

2

由于您希望支持非 ASCII 字符,因此最好\p{L}uswitch 一起使用:

$s = ':hi45/:Username@asdfasfasdf:asfsŚAAÓ,asdfasfasfs:asdf424/asdfas';
if (preg_match_all('/:([\p{L}\d]+)/u', $s, $arr))
   var_dump($arr[1]);

输出:

array(4) {
  [0]=>
  string(4) "hi45"
  [1]=>
  string(8) "Username"
  [2]=>
  string(10) "asfsŚAAÓ"
  [3]=>
  string(7) "asdf424"
}
于 2013-09-26T20:27:59.753 回答
1
/:([a-zA-Z][a-zA-Z0-9]*)/
  • 你至少需要一个字母 [a-zA-Z]
  • 然后任何有效字符序列(字母、数字)[a-zA-Z0-9]*

看演示

<?php
    $string = ":hi/:Username@asdfasfasdf:asfs,asdfasfasfs:asdf424/asdfas";
    preg_match_all('/:([a-zA-Z][a-zA-Z0-9]*)/', $string, $matches);
    print_r($matches[1]);

输出:

Array
(
    [0] => hi
    [1] => Username
    [2] => asfs
    [3] => asdf424
)
于 2013-09-26T20:21:46.867 回答