2013-10-27 2 views
3

Google에서 이틀 동안 검색 중이며 여기 SOF가 많이 있지만이 정규식 preg_match 문제를 해결할 수 없습니다. 나는 간단하게 거리 주소를 긁어 내고 싶다. 그리고 보통은 쉽게 할 수있다. 그러나 몇몇 거리 주소는 약 25 자의 공백 문자를 가진 중간에 줄 바꿈 문자를 가지고 있기 때문에, 내 코드는 빈 배열이나 NULL 만 표시한다.Regex 줄 바꿈이있는 거리 주소를 긁어내는 PHP 코드

아래에는 내가 긁어 모으고 자하는 것의 예와 내가 지금까지 가지고있는 실패한 코드를 보여주는 소스 코드가 포함되어 있습니다. 나보다 많은 경험을 가진 사람의 도움은 이번 일요일 아침 크게 감사 할 것입니다.

여기에 소스 코드 샘플이 있습니다.

<span style="font-size:14px;">736 
        E 17th St</span><br /> 

지금까지의 시도.

$new_data = file_get_contents('someURLaddress'); 

$street_address_regex = '~14px\;\"\>(.*?)\<\/span\>\<br\s\/\>\s~s'; 

preg_match($street_address_regex,$new_data,$extracted_street_address); 

var_dump ($extracted_street_address); 
+2

이 정규식에's' 수정 추가 ~ 단일 라인으로 도트를 사용. –

+0

감사합니다. Niet - 이제 수정 자에 대해 읽어 보겠습니다. 업데이트 : 감사합니다. 나는 가까이서 기다리고 있었다. –

+1

@Whoshooter 그렇게 많이 벗어나지 않아도됩니다 ~ ~ 14px; "> (. *?) ~ s' – HamZa

답변

1

점을 사용하는 것은 끔찍한 연습이므로이 작업을 수행하고 있습니다. 정규 표현식에서 잘못된 것을하고있는 공짜는 단선 옵션을 사용할 때입니다. 이는 엄청난 자원 낭비이며 어느 시점에 깨뜨릴 수밖에 없습니다. 당신이 경우 합법적 인 문자로 <을 기대하거나 굵은 글씨처럼보다 적게보다는 또는 형식 태그를 의미합니다 (어떤 이유로),

$street_address_regex = '~14px;">([^<]*)~i'; 

을 또는 :

이 사용할 필요 99.9 % 긍정적이다

$street_address_regex = '~14px;">([^<]*<)*?\/span~i'; 

을 그리고 그것은 당신이 당신의 문자열에 얻을 것이다 마지막 < 문자를 포맷해야하고 싶지 않은만큼 당신을 귀찮게하는 경우, 당신은이 작업을 수행 할 수 있습니다 또는 기울임 꼴, 당신은이 작업을 수행 할 수 있습니다

$street_address_regex = '~14px;">((?:[^<]*(?(?!<\/span)<))*)~i'; 

.

시험이 With This Tester

.

하지만 솔직히 Regex를 사용해서는 안됩니다. 그런 다음 stripos에게 </span> 입력의을 찾을 수 ... stripos에게 <span style="font-size:14px;">을 찾아 (포인트 시작 주소를 얻기 위해) 길이를 추가 이전 인덱스 (주소는 포인트를 종료 얻을) 발견의 점을 상쇄 . 그들을 빼서 길이를 얻으십시오. 그런 다음 OriginalString, StartIndex 및 Length를 사용하여 하위 문자열을 가져옵니다.

소리가 많이 들리지만 Regex 대신 작은 함수를 사용하고 OriginalString, StartString 및 EndString을 입력하면 방금 전에 설명한 방법으로 StartString과 EndString 사이의 내용을 반환합니다. 기능을 재사용 가능하게 만드십시오.

해당 기능을 사용하면 코드 부분이 이되며은 10 배 이상 빠릅니다. 정규식은 패턴에 대한 지옥만큼 강력하지만 패턴이 없으며 두 정규식 문자열 사이에 내용을 넣을 문자열이 있습니다. Regex 정적 문자열 조작에 대한 지옥 같은 느린 ...특히 쉬버 ~

$Input = '<span style="font-size:14px;">736 E 17th St</span><br />'; 
echo GetBetween($Input, '14px;">', '</span'); 

function GetBetween($OrigStr, $StartStr, $EndStr) { 
    $StartPos = stripos($OrigStr, $StartStr) + strlen($StartStr); 
    $EndPos = stripos($OrigStr, $EndStr, $StartPos); 
    return substr($OrigStr, $StartPos, $EndPos - $StartPos); 
} 
관련 문제