2011-11-28 1 views
1

이 정규 표현식을 대체했습니다 (phpbb 소스 코드에서 가져옴). 나는이링크를 대체 할 PHP 정규 표현식

asdfafdsfdfdsfds 
<!-- m --><a class="postlink" href="http://website.com/link-is-looooooong.txt">http://website.com/link ... oooong.txt</a><!-- m --> 
asdfafdsfdfdsfds4324 

같은 메시지를 통해 그것을 실행하는 경우

$match = array(
       '#<!\-\- ([mw]) \-\-><a (?:class="[\w-]+")?href="(.*?)" target\=\"_blank\">.*?</a><!\-\- \1 \-\->#', 
       '#<!\-\- .*? \-\->#s', 
       '#<.*?>#s', 
      ); 
$replace = array('\2', '', ''); 

$message = preg_replace($match, $replace, $message); 

그것은 내가 대체 기능으로 그것을 만들 싶습니다 그러나이

asdfafdsfdfdsfds 
http://website.com/link ... oooong.txt 
asdfafdsfdfdsfds4324 

반환합니다. 그래서 href를 제공함으로써 블록 내의 링크 제목을 대체 할 수 있습니다.

URL, 새 URL 및 새 제목을 제공하고 싶습니다. 그래서 나는이 변수들로 정규식을 실행할 수 있습니다.

그리고 동일한 원시 메시지가 반환되지만 링크가 변경됩니다.

<!-- m --><a class="postlink" href="http://otherwebsite.com/">hello</a><!-- m --> 

나는 이런 식으로 조정 해 보았지만 올바른 결과를 얻지 못했습니다. 일치하는 결과를 구축하는 방법을 모르므로 교체 후 동일한 형식을 갖습니다.

$message = preg_replace('#<!\-\- ([mw]) \-\-><a (?:class="[\w-]+")?href="'.preg_quote($url).'" target\=\"_blank\">(.*?)</a><!\-\- \1 \-\->#', $replace, $message); 

답변

0

다른 부분도 그룹으로 포착 한 다음 교체 할 때 사용해야합니다. 다음과 같이 시도하십시오.

$replace = '\1http://otherwebsite.com/\3hello\4'; 
$reg = '#(<!-- ([mw]) --><a (?:class="[\w-]+")?href=")'.preg_quote($url).'("(?: target="_blank")?>).*?(</a><!-- \2 -->)#'; 
$message = preg_replace($reg, $replace, $message); 

here을 참조하십시오.

1

HTML을 정규식으로 구문 분석하는 것은 어려울 수 있으며 매우 복잡합니다. 가장 좋은 방법은 DOM 파서 인 like this one을 사용하고 그 대신에 링크를 수정하는 것입니다.

+0

정규식과 html의 문제점을 알고 있습니다. 그러나 phpbb 데이터베이스에서 가져온 구조이므로 항상 일관성을 유지합니다. – Tike