2013-05-07 4 views
0

나는 수년간 아주 잘 작동하고있는 사용자 정의 마크 업 구문 분석 기능을 가지고 있습니다. 나는 최근에 내가 알아 차리지 못했던 버그를 발견했고 그것을 고칠 수 없었습니다. 누군가가 이것으로 나를 도울 수 있다면 그것은 굉장 할 것입니다. 그래서 나는 사용자 정의 빌드 된 포럼과 텍스트 기반의 MMORPG를 가지고 있으며 모든 입력은 마크 업과 같은 bbcode를 위해 새 니타 이징되고 파싱됩니다. 또한 URL을 구문 분석하여 사이트를 떠나는 면책 조항이있는 이탈 페이지로 연결되는 합법적 인 링크로 만듭니다 ... 그래서 내가 가지고있는 문제는 사용자가 여러 개의 URL을 텍스트 상자 (\ n 구분 된 것으로 가정)는 다른 모든 URL을 링크로 변환 만합니다. 다음은 URL의 구문 분석기입니다.PHP 정규식 URL 구문 분석 문제 preg_replace

$markup = preg_replace("/(^|[^=\"\/])\b((\w+:\/\/|www\.)[^\s<]+)" . "((\W+|\b)([\s<]|$))/ei", '"$1<a href=\"out.php?".shortURL("$2")."\" target=\"_blank\">".shortURL("$2")."</a>$4"', $markup); 

위에서 볼 수 있듯이 PHP 함수가 호출되었지만 여기에는 문제가 없습니다. 그런 다음 전체 텍스트 블록이 줄 단위 또는 다른 방법이 아닌 동시에이 preg_replace에 전달됩니다. 이 preg_replace이다를 작성하는 간단한 방법이 있다면

  1. , 그건 내 궁극적 인 목표는 여기

예 INPUT의이 단지 다른 모든 URL을 구문 분석하는 이유를 알아낼 수 있다면 나를

  • 을 알려 주시기 바랍니다 :

    http://skylnk.co/tRRTnb 
    http://skylnk.co/hkIJBT 
    http://skylnk.co/vUMGQo 
    http://skylnk.co/USOLfW 
    http://skylnk.co/BPlaJl 
    http://skylnk.co/tqcPbL 
    http://skylnk.co/jJTjRs 
    http://skylnk.co/itmhJs 
    http://skylnk.co/llUBAR 
    http://skylnk.co/XDJZxD 
    

    예 출력 :

    <a href="out.php?http://skylnk.co/tRRTnb" target="_blank">http://skylnk.co/tRRTnb</a> 
    <br>http://skylnk.co/hkIJBT 
    <br><a href="out.php?http://skylnk.co/vUMGQo" target="_blank">http://skylnk.co/vUMGQo</a> 
    <br>http://skylnk.co/USOLfW 
    <br><a href="out.php?http://skylnk.co/BPlaJl" target="_blank">http://skylnk.co/BPlaJl</a> 
    <br>http://skylnk.co/tqcPbL 
    <br><a href="out.php?http://skylnk.co/jJTjRs" target="_blank">http://skylnk.co/jJTjRs</a> 
    <br>http://skylnk.co/itmhJs 
    <br><a href="out.php?http://skylnk.co/llUBAR" target="_blank">http://skylnk.co/llUBAR</a> 
    <br>http://skylnk.co/XDJZxD 
    <br> 
    
  • +0

    테스트 케이스를 실패 할 수 있습니까? – nhahtdh

    +0

    나는 지금 글을 업데이트했다. –

    답변

    1

    e 플래그가 preg_replace 인 경우는 deprecated입니다. preg_replace_callback을 사용하여 동일한 기능에 액세스 할 수 있습니다.

    i 플래그는 이미 \w이 대문자와 소문자를 모두 일치하므로 이미 패턴이 사용되지 않으므로 패턴에 역 참조가 없습니다.

    플래그를 설정합니다. ^$이 전체 문자열의 시작과 끝이 아닌 줄의 시작과 끝을 일치시킵니다. 이렇게하면 다른 모든 행을 매치시키는 이상한 문제를 해결할 수 있습니다.

    더 많은 캡처 그룹이 이미 텍스트를 캡처 했으므로 일부 그룹을 캡처하지 않음으로 설정합니다. (?:pattern).

    아래 코드는 테스트되지 않았습니다. 나는 단지 regex 테스터에 대한 정규식을 테스트했다.

    preg_replace_callback(
        "/(^|[^=\"\/])\b((?:\w+:\/\/|www\.)[^\s<]+)((?:\W+|\b)(?:[\s<]|$))/m", 
        function ($m) { 
         return "$m[1]<a href=\"out.php?".shortURL($m[2])."\" target=\"_blank\">".shortURL($m[2])."</a>$m[3]"; 
        }, 
        $markup 
    ); 
    
    +0

    와우, 끝내 주네. Regex로 배울 점이 많습니다. 신속한 답변에 감사 드리며 지연에 대해 사과드립니다. –