2013-09-26 2 views
0

Привет, я не очень хорошо знаком с регулярным выражением, и я был бы очень признателен, если бы кто-нибудь мог мне помочь. Мне нужна функция регулярных выражений, которая найдет все шаблоны, которые начинаются с: и за ними следует, по крайней мере, одна буква и, может быть, цифры до следующего появления символа.php regex find string patterns

Например :hi/:[email protected]:asfs,asdfasfasfs:asdf424/asdfas

Как вы можете видеть, здесь есть 4 вхождений. Что я хотел бы добиться того, чтобы в конечном итоге с массивом, содержащим:

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

PS. Письма могут быть на других языках, кроме английского.

Downvoting без причины ... Congrats

Это то, что я использую до сих пор, но я предполагаю, что это было бы легче с регулярным выражением

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; 

} 
+0

см. Последнее обновление – Syd

ответ

2

Поскольку вы хотите поддержка не-ASCII символов, лучше использовать \p{L} с u переключателем:

$s = ':hi45/:[email protected]: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" 
} 
+1

Чёрный чувак, вы помогли мне в другом вопросе регулярного выражения, касающемся перезаписи htaccess. :) спас мою задницу еще раз еще раз спасибо! – Syd

+0

Спасибо, что вспомнил меня и рад, что все это сработало для вас. – anubhava

+0

Помощник может попросить что-то дополнительное в случае, если оно мне понадобится. Как мы можем изменить это регулярное выражение для работы до следующего появления/или - вместо любого символа? – Syd

1
/:([a-zA-Z][a-zA-Z0-9]*)/ 
  • вам нужно по крайней мере, письмо [a-zA-Z]
  • затем любая последовательность допустимых символов (буквы, цифры) [a-zA-Z0-9] *

See demo

<?php 
    $string = ":hi/:[email protected]: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 
) 
+0

Как отредактировать это, чтобы иметь как минимум 1 букву после знака: – Syd

+0

@PanagiotisGeorgeRaditsas посмотреть обновление. – revo