php
  • preg-replace
  • preg-match
  • 2014-03-30 1 views 0 likes 
    0

    텍스트에서 일반 HTML 하이퍼 링크로 대체하려는 확실한 하이퍼 링크가 있습니다. 그래서 이것은 단지 하나의 하이퍼 링크 작동합니다PHP : Preg_match and replace all

    $string = '<u>\\n\\\\*HYPERLINK \\"http://www.youtube.com/watch?v=A0VUsoeT9aM\\"A Youtube Video</u>'; 
    $pattern = '/http[?.:=\\w\\d\\/]*/'; 
    $namePattern = '/(?:")([\\s\\w]*)</'; 
    preg_match($pattern, $string, $matches); 
    preg_match($namePattern, $string, $nameMatches); 
    
    echo '<a href="'.$matches[0].'">'.$nameMatches[1].'</a>'; 
    

    하지만 난 그냥이 모든 하이퍼 링크를 변경할 수 있도록 한 텍스트보다 더 하이퍼 링크가 있습니다 :

    <?php 
        $input = 'Blablabla Beginning Text <u>\\n\\\\*HYPERLINK \\"http://www.youtube.com/watch?v=A0VUsoeT9aM\\"1.A Youtube Video</u> blablabla Text Middle <u>\\n\\\\*HYPERLINK \\"http://www.youtube.com/watch?v=A0VUsoeT9aM\\"2. A Youtube Video</u> blabla Text after'; 
        //To become: 
        $output = 'Blablabla Beginning Text <a href="http://www.youtube.com/watch?v=A0VUsoeT9aM">1. A Youtube Video</a>blablabla Text Middle <a href="http://www.youtube.com/watch?v=A0VUsoeT9aM">2. A Youtube Video</a> blabla Text after'; 
        ?> 
    

    나는 그렇게 할 것이다 어떻게 ?

    +1

    대신 ['preg_match_all()'] (http://www.php.net/preg_match_all)을 사용 하시겠습니까? – kero

    +0

    그렇지만 주변 텍스트가있는 모든 하이퍼 링크를 표시하는 방법은 무엇입니까? – MegaCookie

    +0

    @MegaCookie가 $ 문자열을 다시 덮어 씁니다. –

    답변

    1

    그래서 일치하는 것을 바꾸려면 정확히 preg_replace()을 사용하십시오. 그러나 하나의 명백한 문제가 발생합니다. 현재 preg_match()의 인스턴스가 두 개 있는데 그 중 하나가 preg_replace()의 두 인스턴스로 대체되어야합니까? 아니.

    $pattern = '/http[?.:=\w\d\\/]*/'; 
    $namePattern = '/(?:")([\s\w]*)</'; 
    

    하도록 결합 될 수 (I는 $namePattern 부분 . 추가되므로 링크 정보는 도트를 포함하는 두 번째 예시적인 텍스트 일 ​​수있다) :

    $replacePattern = '/(http[?.:=\w\d\\/]*)\\\\"([\s\w.]*)</'; 
    

    이 때문에 링크 텍스트는 원래 텍스트에 \\"으로 구분됩니다. 이 패턴이 효과가 있고 그렇다면 preg_match_all()을 통해 테스트했습니다. 또한 첫 번째 패턴에 ()을 추가하면 그룹화됩니다.

    $replacePattern = '/(http[?.:=\w\d\\/]*)\\\\"([\s\w.]*)</'; 
    //     ^-group1-----------^  ^-group2-^ 
    

    이러한 그룹을 이제 replace 문에서 사용할 수 있습니다.

    $replaceWith = '<a href="\\1">\\2</a><'; 
    

    어디 초 내지 제 기와 \\2-\\1 포인트. 결국 이 필요합니다. 왜냐하면 preg_replace()은 찾은 전체 패턴 (그룹뿐만 아니라)을 대체 할 것이고 <은 패턴의 끝에 있기 때문에 교체 부분에 없으면 잃을 것입니다.

    당신이 지금 필요로하는 모두는 다음과 같은이 매개 변수 preg_replace()를 호출하는 것입니다 다음 $replacePattern

    $output = preg_replace($replacePattern, $replaceWith, $string); 
    

    모든 발행 수는 이제 $replaceWith의 자신의 버전으로 대체하고 변수 $output에 저장됩니다.


    너는 here을 볼 수있다. 더 큰 부분을 제거하려면


    , 그냥 $replacePattern을 확장합니다.

    $replacePattern = '/<u>.*?(http[?.:=\w\d\\/]*)\\\\"([\s\w.]+)<\/u>/'; 
    $replaceWith = '<a href="\\1">\\2</a>'; 
    

    (IT here 참조) .*? 모든 것을 일치하고 (그래서 여기가 http...입니다) 다음에 오는 어떤 내용의 요소를 선두를 발견하면이 중지됩니다 의미 욕심하지입니다 것입니다.

    +0

    고마워요. 링크를 바꾸는 데는 문제가 없지만, \ n \\ * HYPERLINK \ " 부분도 삭제하고 싶습니다. 무엇을 권하고 싶습니다? 그리고 이상한 상황에 처하게됩니다. URL 이름에 점이있어서 점 사이에 하이퍼 링크 만 생깁니다. – MegaCookie

    +0

    @MegaCookie 업데이트를 참조하십시오 – kero

    +0

    와우 대단히 감사합니다! 모든 것이 완벽하게 작동합니다. – MegaCookie

    관련 문제