2014-09-09 3 views
1

foreachpreg_replace()에 문제가 있습니다. 텍스트 문자열을 가지고 preg_replace()을 사용하여 @ 기호 다음에 나오는 모든 단어를 추출한 다음 데이터베이스에 각 값을 전송하는 데 사용할 수있는 배열을 만듭니다.preg_replace가있는 foreach가 1 개의 결과 만 출력합니다.

현재 첫 번째 결과 만 출력됩니다. 이 문제를 해결하도록 도와 주시겠습니까? :) 대신

<?php 
$status['message'] = 'Hello I would like to tag @james and @bob and @barry'; 
preg_match('/(?<[email protected])\S+/i', $status['message'], $match); 

foreach($match as $tag) { 
    // insert each result into database 
    echo $tag; 
} 
?> 

답변

2

사용 preg_match_all :

이 - 전역 정규 표현식 매치

$status['message'] = 'Hello I would like to tag @james and @bob and @barry'; 
preg_match_all('/(?<[email protected])\S+/i', $status['message'], $match); 

foreach(reset($match) as $tag) { 
    // insert each result into database 
    echo $tag . '<br/>'; 
} 
0

음을 수행, preg_match()는 첫 번째 결과를 내뿜으며. 첫 번째 결과를 찾은 후 중지합니다. 만약 당신이 read the documentation 그러면 알 것입니다.

모든 경기를 얻으려면 preg_match_all()을 사용해야합니다.

정규 표현식도별로 잘 생각하지 못했습니다. 공백 문자를 포함하지 않는 한 아무 것도 (무효 태그 포함) 거의 일치합니다. 예를 들어, @@!"#¤%과 같은 것이 일치합니다 ...

정규 표현식을 작성할 때 일반적으로 가능한 한 항상 제한하는 것이 좋습니다. 즉, 필요한 항목과 일치해야합니다. \S+과 같은 와일드 카드를 사용하여 모든 문자를 제외하고는을 제외하고는 거의 좋은 아이디어가 아닙니다.

이와 비슷한 것이 개선 될 것입니다. 그러나 일치하지 않아야하는 내용 (예 : @user, @@user~)과 일치합니다.

$regex = '/(?<[email protected])[a-zA-Z0-9_]+/'; 
관련 문제