2012-05-29 2 views
4

크기에 대해 여러 개의 약어가있는 구문 분석을 시도하고 있습니다. 예를 들어, 매체 I 간단한'word'와 1 문자 길이가 일치하는 정규 표현식

'제품의 XYZ m'잘 동작
preg_match('/m|medium|med/i',$prod_name,$matches); 

시도

m, medium, med 

수있다. 그러나 '제품 s/m abc'를 시도하면 가양 성 일치가 나타납니다. I는 또한 단어가 발견 될 강제

preg_match('/\bm\b|\bmedium\b|\bmed\b/i',$prod_name,$matches); 

을했지만, S/m에서 m은 여전히 ​​일치하고있다. 이 단어는 엔진에서 '/'를 단어 분리 문자로 사용하기 때문에 발생한다고 가정합니다.

그래서 요약하면 'm'은 문자열과 일치해야하지만 's/m'또는 'small'등은 일치해야합니다. 도움이 필요합니다.

답변

6
%\b(?<![/-])(m|med|medium)(?![/-])\b% 

당신은 잘못된 분리를 제외 부정적인 lookbehind 또는 내다을 사용할 수 있습니다. 즉, "m"/"med"/"medium"은 자체 단어이지만 슬래시 또는 대시가 나오거나 뒤에 오지 않습니다. 부정적 lookahead/lookbehind는 일치하는 문자를 강제하지 않으므로 문자열의 시작과 끝에서도 작동합니다.

만 공백을 구분하려는 경우, 당신은 긍정적 인 버전을 사용할 수 있습니다 : 공백 또는 말까지 공백이나 문자열의 시작 앞에, 그리고 뒤에

%\b(?<=\s|^)(m|med|medium)(?=\s|$)\b% 

("m"/"med"/"medium" 문자열)

+0

그가 작업하고있는 문자열이 매우 동적이지 않은 경우에만 유용합니다. Regex는 새로운 상처를주는 캐릭터가 추악한 머리를 되 찾을 때마다 깨지기 만하면 지속 가능한 해결책이 아닙니다. –

+1

@BenRoux : 부여되었습니다. 대체 양식을 제공 할게. – Amadan

+0

작은 후속 질문 - preg_match (예 : array ([0] => med [1] => med))를 사용하여이 표현식을 사용하여 중복 된 일치 항목을 얻는 것 같습니다. 왜 어떤 아이디어? 정말 문제가되지 않습니다 - 그냥 내 정규식 이해를 더 잘하려고. – Conor

0

시도해보십시오. medium, medm과 일치해야합니다.

medium|med|^m$ 
+0

이 단지' "m"'(문자열에서 혼자 문자 m)와 일치하지만,하지 : 레그에서 \b 때문에, 단어 경계를 나타냅니다. – Amadan

+0

은'^ medium | med | m $' –

+0

이어야합니다 @AhmedJolani : 'medium'으로 시작하는 문자열,'med'를 포함하는 문자열 및'm'으로 끝나는 문자열을 일치시킵니다. – Ryan

1

나는 항상 이런 것들을 처음부터 생각한다. 그리고 re_format(7)에 따르면 ERE의 단어 경계 인 [[:<:]][[:>:]]은 각각 단어의 시작과 끝의 null 문자열과 일치합니다. 아마도,

/[[:<:]](m(ed(ium)?)?)[[:>:]]/ 

또는 쉽게 읽을 : 레그는 ERE 표기법을 이해하고 있어야하기 때문에 그래서 ... 나는 갈 수 PHP에서

/[[:<:]](m|med|medium)[[:>:]]/ 

하지만, 대신 ERE의 레그로 사용할 수 있습니다. ` "셔츠 m 남성"`

preg_match('/\b(m(ed(ium)?)?)\b/', $prod_name, $matches); 
관련 문제