2012-10-22 6 views
0

이 코드에 문제가있어서 PHP 메소드 'substr'이 재생되고 있습니다. 나는 단지 그것을 얻지 않는다. 여기 내가 달성하려고하는 것을 간략하게 소개합니다. 나는 Joomla의 이메일 구독자들과 함께이 거대한 XML 문서를 가지고있다. Mailchimp에 가져 오기를 시도하고 있지만 Mailchimp는 전자 메일을 목록으로 가져 오는 구문 구문에 대한 몇 가지 규칙을 가지고 있습니다. 그래서 순간에 구문은 다음과 같다 :PHP substr이 아무것도 표시하지 않습니다

<subscriber> 
    <subscriber_id>615</subscriber_id> 
    <name><![CDATA[NAME OF SUBSCRIBER]]></name> 
    <email>[email protected]</email> 
    <confirmed>1</confirmed> 
    <subscribe_date>THE DATE</subscribe_date> 
</subscriber> 

내가 모든 이메일을 받아이 같은를 출력하는 간단한 PHP 스크립트 만들고 싶어 :

[[email protected]] [NAME OF SUBSCRIBER] 
    [[email protected]] [NAME OF SUBSCRIBER] 
    [[email protected]] [NAME OF SUBSCRIBER] 
    [[email protected]] [NAME OF SUBSCRIBER] 

을 내가 그렇게 할 수있는 경우를, 그런 다음 Mailchimp에 붙여 넣기 만하면됩니다.

지금 여기에 지금까지 내 PHP 스크립트입니다 :

$fileName = file_get_contents('emails.txt'); 

foreach(preg_split("/((\r?\n)|(\r\n?))/", $fileName) as $line){ 

    if(strpos($line, '<name><![CDATA[')){ 
     $name = strpos($line, '<name><![CDATA['); 
     $nameEnd = strpos($line, ']]></name>', $name); 
     $nameLength = $nameEnd-$name; 
     echo "<br />"; 
     echo " " . strlen(substr($line, $name, $nameLength)); 
     echo " " . gettype(substr($line, $name, $nameLength)); 
     echo " " . substr($line, $name, $nameLength); 


    } 
    if(strpos($line, '<email>')){ 
    $var1 = strpos($line, '<email>'); 
    $var2 = strpos($line, '</email>', $var1); 
    $length = $var2-$var1; 
    echo substr($line, $var1, $length); 

    } 
} 

첫 번째 경우 문이 정상적으로 작동합니다. 그것은 줄에 ''태그가 있는지 식별하고,있는 경우 태그를 찾아서 substr-method를 사용하여 전자 메일을 출력합니다.

두 번째 if 문은 나를 귀찮게합니다. If는 첫 번째 if 문과 동일한 작업을 수행해야하지만 그렇지 않습니다. 길이가 정확한 길이입니다 (제가 확인했습니다). 유형이 올바른 유형입니다 (확인했습니다). 그러나 내가 그것을 되풀이하려고 할 때 아무 일도 일어나지 않습니다. 스크립트는 계속 실행되지만 아무 것도 쓰지 않습니다.

나는 꽤 많은 것을 가지고 놀았으며 모든 것을 시도한 것처럼 보입니다. 그러나 나는 그것을 알 수 없습니다.

+9

http://php.net/simplexml 대신이 귀찮은 문자열 피딩 방식을 사용하는 특별한 이유가 있습니까? – mario

+0

스택 오버플로에 오신 것을 환영합니다! RegEx를 사용하여 HTML을 구문 분석하지 마십시오 ([http : //stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454]) . 대신 [HTML 구문 분석기] (http://stackoverflow.com/questions/292926/robust-mature-html-parser-for-php)를 사용하십시오. –

답변

1

명령을 포함하여 몇 가지 문제가 있습니다. 줄의 시작 부분에서 실제로 의도 한 것처럼 보이지 않는 태그를 발견하면 0을 반환합니다.

또한 XML의 형식이 정확히 지정되지 않은 경우 한 줄에 각 여는 태그와 닫는 태그가 있으면 로직도 실패합니다.

그것은 이런 이유로 XML 처리를 다시 발명하는 것은 좋은 생각이 아니다 ... 여기에 다른 제안으로

이 문제에 대한 더 나은 솔루션이다 *.

$xml = simplexml_load_file('emails.txt'); 
foreach($xml->subscriber as $sub) 
{ 
    // Note that SimpleXML is aware of CDATA, and only outputs the text 
    $output = '[' . $sub->name . ']' . ' ' . '[' . $sub->email . ']'; 
} 

* 이것은 XML 즉 "가입자"블록이 최상위 레벨에서 하나의 부모에 포함 된 유효한 것으로 가정합니다. 물론 simplexml documentation을 사용하여 사용 사례를 조정할 수 있습니다.

+0

이 작품! 좋아 고마워. – Zeth

3

부울 FALSE를 반환 할 수
이 경고 기능 아니라 논리 FALSE 값을 반환 할 수있다. 자세한 내용은 부울에 대한 절을 읽으십시오. 이 함수의 반환 값을 테스트하려면 === 연산자를 사용하십시오. 당신이 the pony he comes에 해당 않도록 당신이 XML 파서를 사용한다, 그래서

당신은 제쳐두고, 파일이 XML 될 것으로 보인다

if(strpos($line,'...') !== false) {를 사용한다.

DOMDocument이 좋습니다. 다음과 같이 할 수 있습니다.

설명 된 형식으로 이름과 이메일을 출력합니다.

+0

더 잘 대답 할 수 없었습니다. 잘 했어. –

+0

simplexml이 더 나은 옵션 일 수 있다고 생각합니다. DOMDocument는 HTML과 DOM을 사용하는 것이 좋지만 기본 XML 파싱은 SimpleXML에서 더 좋을 수도 있습니다. 적어도 아래 예에서와 같이 코드가 적습니다. – FilmJ

+0

고맙습니다. – Zeth

관련 문제