2014-04-05 3 views
2

현재 회신 기능을 사용하여 채팅 시스템을 구축 중입니다. [123456789]PHP Regex는 대괄호 안에 숫자를 추출합니다.

이 하나가 자바 스크립트

/@\[(0-9_)+\]/g 

작동하지만이 같은 PHP에서 작동하지 않습니다 @

어떻게는 '@'기호와 괄호 안에 예를 들어 숫자를 일치시킬 수 있습니다 /g 수식어는 인식 할 수 없습니다. 그래서 나는이 시도 :

/\@\[[^0-9]\]/ 

을 나는 다음 예제 코드가 있습니다

$example_message = 'Hi @[123456789] :)'; 

$msg = preg_replace('/\@\[[^0-9]\]/', '$1', $example_message); 

그러나이 작동하지 않습니다, 그것은 @ [] 안에 그 숫자를 캡처하지 않습니다를. 어떤 제안? 감사합니다

+3

귀하의 문제는 문자 클래스의'^'가 * 음수 *를 찾습니다 (그래서'[^ 0-9]'는 숫자 이외의 것을 찾습니다). 진짜 대답 들어오는 .... – Sam

+1

또한 JS 정규식은 실제로/@ [[0-9 _] + \]/g'이어야합니다 (대괄호 안에 포함되지 않아야 할 경우 밑줄을 제거하십시오). – Jerry

답변

5

정규 표현식에 핵심적인 문제가 있습니다. 주된 문제는 문자 클래스를 무효화하는 ^입니다. 따라서 임의의 숫자와 일치하는 [^0-9] 대신 과 일치하지만 숫자는입니다. 또한 gmodifier은 PHP에 존재하지 않으며 (preg_replace()은 전 세계적으로 바뀌며 preg_match_all()을 사용하여 표현식을 전체적으로 일치시킬 수 있습니다).

/@\[(\d+)\]/과 같은 정규식을 사용하여 @[] 사이의 모든 숫자를 (그룹과) 일치시키는 것이 좋습니다.

는 PHP의 문자열에 전 세계적으로이 작업을 수행하려면 preg_match_all()를 사용 : 당신이 일치하는 그룹 (\d+)에 의존하지 않은 경우
preg_match_all('/@\[(\d+)\]/', 'Hi @[123456789] :)', $matches); 
var_dump($matches); 

는 그러나 코드가 깨끗하다. 대신 (?<[email protected]\[)\d+(?=\])과 같은 '둘러보기'를 사용할 수 있습니다.또한 문자열 당 한 자리 수만 있으면 preg_match()이 아닌 preg_match_all()을 사용해야합니다.

참고 : 예를 모호하게하고 많은 문서에 연결하여 더 잘 읽고 알 수 있습니다. 질문이 있으시면, 물어보십시오. 또한 사용 된 정규 표현식에 대한 더 나은 설명을 원하면 (특히 둘러보기를 사용하는 두 번째 정규 표현식) 알려주세요. 기꺼이 자세히 설명해 드리겠습니다.

1

g 수정 자의 동작을 Javascript로 생성하려면 PHP에서 preg_match_all 함수를 사용하십시오. 그렇지 않으면 preg_match 함수를 사용하십시오.

preg_match_all("/@\\[([0-9]+)\\]/", $example_message, $matches); 

설명 :
/ 오프닝 경기 @
구분 기호
\\[ 경기를 여는 대괄호에
[0-9] 일치 a를 캡처
( 시작 (메타 문자, 그래서 탈출해야합니다)를 숫자
+ 이전 한 번 또는 mo와 일치
) 캡처 중지
\\] 일치 닫는 대괄호 재
/ 지금 $matches[1]이 대괄호 안에 모든 숫자를 포함

구분 기호 폐쇄 (메타 문자, 그래서 탈출해야합니다).

관련 문제