2012-04-14 5 views
3

내의 URL과 일치하지 않는 웹 사이트에 코멘트 섹션을 만들기위한 정규식. 는 처음에는 어떤 URL을 찾는 정규 표현식을하고 모든 URL의 의견에를 찾기 위해이URL을 preg_replace하지만 bbcode [url]

<a href="url"></a> 
그래서

내가 슈퍼 정규 표현식을 발견 둘러싸여 대체하기 위해 필요하고 나는 모든 반환하는 함수를했다 HTML 태그가있는 URL :

function addURLTags($string) { 
    $pattern = "/(?i)\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))/"; 
    return preg_replace($pattern, '<a href="$1">$1</a>', $string); 
} 

모든 것이 우수 해졌습니다. 하지만 1 주일 전에 상사가 나에게 bbcode를 덧글 섹션에 추가해야한다고했습니다. 그리고 나는 "문제 없음"과 같았습니다 ...하지만 그는 내 함수 addURLTags가 머물러 있어야한다고 말했습니다.

그래서 같은 문자열 :

http://www.google.com 
[url]http://www.google.com[/url] 
[url="http://www.google.com"]http://www.google.com[/url] 

이 동일한 문자열로 교체해야합니다은 :

<a href="http://www.google.com">http://www.google.com</a> 

그래서 나는 HTML 코드에 모든 BBCode는의 발생 회수를 대체하는 약간의 PHP 라이브러리를 얻었다.

그리고 나는 생각했다 : "좋아, 처음 나는 beggining에서 [URL] 태그가없는 모든 URL의 발생 회수를 받아야 둘째 나는 모든 BBCode의 태그를 대체!"

그리고 난에 시도 슈퍼 정규 표현식의 시작 부분에 다음과 같은 부정적인 주장을 추가하십시오.

/(? i) \ b (?: [url]) (?: https ?: // www \ d {0, [+] (| [^ \ s()]) [[az]) (+) :(([^ \ s() <]] | | (([^ \ s() <) >] +)))(예 :) | [^ \ s`!() [] {}; : '\ "., <>?«»" "' ']))/

그러나 didnt work!

정규식이있는 초보자 나 필자가 시도한 모든 온라인 테스터는 긴 정규식으로는 잘 작동하지 않습니다. 나는 그 밖의 무엇을 시도하는지 모른다.

의견이 있으십니까? [url] bbcode 태그의 유무에 관계없이 "url replacement"를 수행하는 PHP lybrary를 알고 계십니까?

미리 감사드립니다.

답변

1

여기서 두 가지 문제를 해결합니다. 그래서 그것들을 개별적으로 해결하고 모든 것을 단 하나의 정규 표현으로 풀지 마십시오.

분할 및 정복 : 다음

"normal text", "bbcode", "normal text", "bbcode" 

당신이 BBCode의 라이브러리를 적용

먼저 당신이 당신의 텍스트의 스트림을 만들 수 있도록, 해당 URL이 부분을 찾으려면 BBCode는 라이브러리를 사용 "bbcode"세그먼트에만 URL을 만들면 URL 클릭 가능 제조사가 "일반 텍스트"세그먼트에만 적용됩니다.

모든 세그먼트를 처리 한 후에 모두 다시 한 문자열로 연결합니다.

Voila, 문제가 해결되었습니다.

+0

나는 너무 많은 것에 초점을 맞추어 나의 방식대로, 나는 모든 가능성을 바라 볼 수 없었다. 코멘트 문자열을 splitted하고 모든 bbcode의 문자열을 저장합니다. 그런 다음이 모든 것을 bbcodelibrary로 보냅니다. 나머지 문자열은 슈퍼 정규 표현식에서 잘 작동했습니다. 정말 고맙습니다! –

0

[url] BBCode를 먼저 구문 분석 한 다음 맨손으로 된 URL을 링크로 만드는 것이 좋습니다. URL 앞에 큰 따옴표가 없는지 확인하기 위해 부정적인 lookbehind를 사용하면 쉽게 달성 할 수 있습니다. 이것은 원래 문자열의 따옴표를 이미 &quot;으로 변환했기 때문에 효과가 있습니다. 따라서 링크 작성자의 일부로 URL 앞의 실제 따옴표가 있어야합니다.