2017-01-17 3 views
0

PHP에 preg_match 표현식을 사용하여 일반 약어를 반환 한 다음 단어의 전체 버전 (예 : "St."이 "Street"이 됨)으로 바꾸기 위해 노력하고 있습니다. 데이터 베이스.preg_match를 사용하여 약어 확장하기

약어, 전체 약어, 선택적 "."앞에 공백, 문자열 또는 공백의 끝 ("역"에 대해 일치하지 않음)을 일치시켜야 함을 의미합니다. 나는 시도했다 :

preg_match("#\s(S|s)t\.?\s#" , $my_string , $matches) 
preg_match("#(\s(S|s)t\.?)+(\s|$)+#" , $my_string , $matches) 
preg_match("#(\s{1}(S|s){1}t{1}\.?){1}\s{1}#" , $my_string , $matches) 

필자는 예상하지 못하는 이유를 모르겠다. 때 $my_string = "My St. and something else" :.

1 $ 일치 : array (" St." , "S")

2 : array (" St." , " St." , "S", " ")

3 : array (" St.", " St." , "S")

그것은 경우 "성"에 해당 일치를 반환 가 "st.", "St"또는 "st"로 바뀝니다.

이러한 경우 일치 항목을 단일 인스턴스로 좁히려면 어떻게합니까?

기능적으로 첫 번째 경기 만 대체하기 때문에 해당 대체물이 작동하는 것처럼 보이지만 한 경기로 좁힐 수 있어야합니다.

두 번째 질문에서 두 번째 질문에서 두 번째 질문에 공백이나 문자열의 끝 부분에 (\s|$)을 사용하려고합니다. 그렇지 않은 경우 어떻게해야합니까?

+0

https : //로 regex101. – yivi

답변

0

당신이 할 경우 this :

preg_match("#(?<=\s)([Ss]t\.?)\s#" , $my_string , $matches); 

배열 $ 일치의 첫 번째 요소는 "성"(전체 일치)가되며, 두 번째 요소는 "성"부분 당신이해야합니다 대체하고 싶다.

오히려 앞의 빈과 일치 후행 한 피 경우

preg_match("#(\s[Ss]t\.?)(?>\s)#" , $my_string , $matches); 

을 당신은 두 번째는 here 작업 볼 수 있습니다. 글쎄, 완성도 위해, 나는이 같은 더 많거나 적은 일을 할 것

: 당신은 모든 일이 here 작업 볼 수 있습니다

$patterns  = []; 
$replacements = []; 
$string  = "The St. Leicester Square is near a statue located somewhere. 
The train left the St"; 

$patterns[]  = "#(?<=\s)([Ss]t\.?)(?=\s|$)#m"; 
$replacements[] = "station"; 

echo preg_replace($patterns, $replacements, $string); 

.

+0

디버거와 테스터에 대한 링크는 매우 유용합니다! (예 : /? 감사. 하지만 내가 찾고있는 경기는 "St."또는 "St."입니다. (문자열의 끝 부분 인 경우). 대체품을 지정하기가 쉽지만 "거리"입니다.그래서 나는 후행 공간과 일치하지 않도록 미리보기를 원하고 lookbehind를 제거 할 수 있다고 생각하고 있습니까? 또한 2 경기를 반환합니다 ...하지만이 문제는 아닙니까? 첫 번째 경기는 항상 가장 긴 것 같습니다. 이 아마도 같은 – rotaryspd

+0

:'# (\의 [SS] t \.?) (= \의?) #의' 편집 : 아니, 아직 두 경기 – rotaryspd

+1

아, 그것을 얻었다! 실제로'# (? <= \ s) ([Ss] t \.?) (? = \ s) #'를 사용하고 대신 "Street"대신 "Street"을 사용했습니다. 또한, 나는 단지 두 경기가 정상적인 행동이라는 것을 읽었습니다. – rotaryspd

1

당신은 부정적인 lookarounds를 사용하여 수행 할 수 있습니다

/(?<!\S)st\.?(?!\S)/i 

당신이 교체해야 할 부분 주위에 어떤 공백을 일치하지 않아도이 방법 :

$str = preg_replace('/(?<!\S)st\.?(?!\S)/i', 'Street', $str); 
관련 문제