2009-12-07 6 views
2

단락에 "정지 단어"가 포함되어 있는지 확인해야합니다. 정지 단어는 아래 배열에 있습니다. 충분히 잘 작동또 다른 까다로운 preg_match

$pattern_array = array("preheat", "minutes", "stir", "heat", "put", "beat", "bowl", "pan"); 

    foreach ($pattern_array as $pattern) { 
     if (preg_match('/'.$pattern.')/i', $paragraph)) { 
     $stopwords = 1; 
     } 
    } 

하지만 중지 단어로 식별 'panko'와 같은 '팬'단어와 같은 짧은 단어 :

나는대로 공식을했다.

그래서 정규 표현식은 앞에 공백이 있거나 줄 바꿈이 시작되고 전체 정지/공백/쉼표/​​(다른 비 문자 객체)로 끝나는 것과 같을 것입니다.

어떻게 멈춤 단어가 식별되자 마자 루프를 종료하도록 PHP에 알릴 수 있습니까?

고마워요, 내가 배우로서 학습 정규식을 느리게합니다!

+1

지금까지 루프를 중지와 같은 당신이 일치하는 항목을 찾을 수 php.net/break –

답변

4

정규 표현식으로 \b(preheat|minutes|stir|heat|put|bowl|pan)\b을 사용하십시오. 그런 식으로 하나의 정규식 (루핑 필요 없음) 만 필요하고 \b 단어 경계 어설 션을 사용하면 단어 전체가 일치하는지 확인해야합니다.

+0

Ok Ive는이 접근 방식을 사용했습니다 \ b) 그리고 정규 표현식에있는 항목의 양이 너무 커지면 성능 문제에 대한 경고를 받았다. 얼마나 많은 아이템이 너무 많을까요? – bluedaniel

+0

말하기 어렵다. 당신이 단어 경계를 일치시키고 싶다면 regexes를 고수하고 많은 정규 표현식을 루핑하는 것은 하나의 큰 정규 표현식을 갖는 것보다 느리다. regex 엔진은 부분 일치를 건너 뛸 수 있도록 \ b (p (? : reheat | ut | an) | st (? : ir | ove) | 등)와 같은 최적화를 수행 할 수 있습니다. 문자는 일치하지 않지만 불필요하게 최적화하기 전에 우선 시도해보십시오. –

+0

흠 흥미로운 접근 방식입니다. 앱이 예상대로 작동하고 작은 부분을 최적화하는 경우입니다. 아프다 나중에 시도하고 후속 귀하의 대답을 받아들이 병. 건배. – bluedaniel

2

시도한 적이 없지만 찾고있는 문자 그룹이 \b이어야합니다. 부터 PHP manual :

다음과 같이 보일 것입니다 귀하의 코드

\b word boundary 
:

$pattern_array = array("preheat", "minutes", "stir", "heat", "put", "beat", "bowl", "pan"); 

foreach ($pattern_array as $pattern) { 
    if (preg_match('/\b'.$pattern.'\b/i', $paragraph)) { // also removed the ')' 
    $stopwords = 1; 
    break; // to exit the loop 
    } 
} 

편집 : 사람들이 \의 B를 사용하여 더 나을 것 같다, 그래서 변경 추가하기 위해 필요한이 따라

+0

을 체크 아웃 할 때 제목 문자열의 끝에 일치하지 않습니다. – SilentGhost

+0

또는 그 문제의 시작은 – SilentGhost

+0

은 '\ b'을 사용하도록 코드를 변경했습니다. 감사합니다 .-) –

2

이 단어의 경계를 나타내는 \b (정규 표현식)은 다음과 같습니다.

'/\b'.$pattern.'\b/i' 

코드에 오타가있는 것 같습니다. 리터럴 닫기 괄호가 있고 단어의 일부와 일치하지 않거나 닫는 대괄호가 있기 때문입니다.

+0

예 죄송합니다. 이전 코드 테스트에서 오타입니다. – bluedaniel

2

1. 단어 경계를 확인하려면 "\ b"를 사용할 수 있습니다. 단어 경계는 단어 문자와 단어가 아닌 문자 사이의 경계로 정의됩니다. 단어 - 문자는 글자, 숫자 및 밑줄입니다. "|"

2. 당신은을 사용하여, 한 가지에 모든 작업을 수행 할 수 있습니다

$stopwords = preg_match('/\\b(preheat|minutes|stir|heat|..other words..|pan)\\b/i', $paragraph) 
+0

Ok Ive는이 접근법 (하나의 정규 표현식에서 \ b가 아닌)을 사용했고 정규 표현식의 항목 수가 너무 커지면 성능 문제에 대해 경고했습니다. 얼마나 많은 아이템이 너무 많을까요? – bluedaniel