2012-08-16 3 views
1

메시지 보드를 만들기 위해 phpBB3을 사용하고 있습니다. 게시물의 모든 URL과 링크를 링크로 사용하는 기능이 내장되어 있습니다. 로컬 링크 만 클릭 할 수 있도록 설정하려고합니다.phpbb와 함께 사용하기위한 로컬 URL 만 일치시키는 정규식

phpbb3 각 경기가 링크로 변경하는 게시물의 텍스트와에 대한 정규식을 사용

if ($somestuff){ 
// matches a xxxx://aaaaa.bbb.cccc. ... 
$magic_url_match[] = '#(^|[\n\t (>.])(' . "[a-z]$scheme*:/{2}(?:(?:[a-z0-9\-._~!$&'($inline*+,;=:@|]+|%[\dA-F]{2})+|[0-9.]+|\[[a-z0-9.]+:[a-z0-9.]+:[a-z0-9.:]+\])(?::\d*)?(?:/(?:[a-z0-9\-._~!$&'($inline*+,;=:@|]+|%[\dA-F]{2})*)*(?:\?(?:[a-z0-9\-._~!$&'($inline*+,;=:@/?|]+|%[\dA-F]{2})*)?(?:\#(?:[a-z0-9\-._~!$&'($inline*+,;=:@/?|]+|%[\dA-F]{2})*)?" . ')#ie'; 
$magic_url_replace[] = "make_clickable_callback(MAGIC_URL_FULL, '\$1', '\$2', '', '$class')"; 

// matches a "www.xxxx.yyyy[/zzzz]" kinda lazy URL thing 
$magic_url_match[] = '#(^|[\n\t (>])(' . "www\.(?:[a-z0-9\-._~!$&'($inline*+,;=:@|]+|%[\dA-F]{2})+(?::\d*)?(?:/(?:[a-z0-9\-._~!$&'($inline*+,;=:@|]+|%[\dA-F]{2})*)*(?:\?(?:[a-z0-9\-._~!$&'($inline*+,;=:@/?|]+|%[\dA-F]{2})*)?(?:\#(?:[a-z0-9\-._~!$&'($inline*+,;=:@/?|]+|%[\dA-F]{2})*)?" . ')#ie'; 
$magic_url_replace[] = "make_clickable_callback(MAGIC_URL_WWW, '\$1', '\$2', '', '$class')"; 
} 
return preg_replace($magic_url_match, $magic_url_replace, $text); 

가 어떻게이 정규식을 다시 작성할 수 있습니다 그들은 단지 내 도메인에 링크를 일치하도록? 또한, 정규식 자신을 가르치는 가장 좋은 방법은 무엇입니까?

+1

REGEX의 어머니 – SomeKittens

+0

신성한 몰리 !!! 그게 내가 부르는 ** REGEX ** - [이] (http://i0.kym-cdn.com/photos/images/original/000/199/693/disgusted-mother-of-god.png?1321272571) –

+0

나는 REGEX를 좋아한다고 말하지 않았다! –

답변

2

이것은 첫 번째 섹션으로 섹션별로 나누어 져 있습니다. 심지어 ...이 아닌 사소한했다

(
    ^
| 
    [\n\t (>.] 
) 

확인을하고, 우리가 단순히 "라인의 시작을, 또는 개행, 탭, 공간, 기간보다. 그냥 정규식을 고정 후.

(
    [a-z]$scheme*:/{2} 

이 바로 여기 순수한 광기이다. $scheme는 아마도이 정규식, 내가 생각하기 시작할 수없는 http://가. 왜 누군가가 // 대신 /{2}를 사용하는 것이 일치 즉, http를 보유하고 있습니다.

(?: 
     (?: 
      [a-z0-9\-._~!$&'($inline*+,;=:@|]+ 
     | 
      %[\dA-F]{2} 
     )+ 
    | 

일련의 문자와 일치하며 아마도 URL에서 유효합니다. 주목할 것은 PHP 변수 $inline이 무엇인지 파악할 수 없다는 것과 두 번째 대안 인 %[\dA-F]{2}입니다. 이는 %20 같은 공백과 일치합니다. % 기호는 경기 (또는 URL)에서 유효하지 않습니다.

/은 법적으로 유효하지 않습니다. 따라서 디렉토리를 참조 할 수 없으며 도메인 만 참조 할 수 있습니다. 이는 웹 사이트의 적절한 도메인과 간단히 일치시키기 위해 변경하려는 부분 일 가능성이 큽니다.

그래도 나머지는 여기 있습니다.

 [0-9.]+ 
    | 

또는 일련의 숫자와 마침표 - IP 주소를 사용할 수 있습니다. 이 정규식이 얼마나 복잡한 고려, 나는

 \[ 
     [a-z0-9.]+ 
     : 
     [a-z0-9.]+ 
     : 
     [a-z0-9.:]+ 
     \] 
    ) 

이 여기에 우리의 마지막 대안이다 ... 그는 (?:\d{1,3}\.){3}\d{1,3} 들어주지 않았다 놀랐어요; 나는 이것이 IPv6를위한 것이라고 생각한다. 어쨌든 콜론으로 구분 된 일련의 16 진수입니다. 그것은 우리 콜론 다음과 같은 몇 가지 숫자의 옵션을 얻을, 여기에 ...이 내가 특히 태그를 너무 많이들을 사용하는 포럼 소프트웨어, 이상한 찾을 대괄호, 내 것이

(?: 
     : 
     \d* 
    )? 

이 필요합니다. 즉, 포트가있는 URL에 대한 것입니다. 처음에 / 같이

(?: 
     /
     (?: 
      [a-z0-9\-._~!$&'($inline*+,;=:@|]+ 
     | 
      %[\dA-F]{2} 
     )* 
    )* 

OK, 우리가, 하위 디렉토리에 들어 왔. 그렇지 않으면 "법적 URL 문자"와 일치합니다.마지막으로

(?: 
     \? 
     (?: 
      [a-z0-9\-._~!$&'($inline*+,;=:@/?|]+ 
     | 
      %[\dA-F]{2} 
     )* 
    )? 
    (?: 
     \# 
     (?: 
      [a-z0-9\-._~!$&'($inline*+,;=:@/?|]+ 
     | 
      %[\dA-F]{2} 
     )* 
    )? 
) 

\?에 의해, GET에 의해 전달 표시되는 것들과 \#에 의해 표시되는 페이지 중간 앵커에 링크 URL이 표시됩니다.

결론 :

이 섹션 :

[a-z]$scheme*:// 
    www\.example\.com 

아니면

[a-z]$scheme*:// 
    (?: 
     www\.example\.com 
    | 
     192\.168\.0\.1 
    | 
     ::ffff:192\.168\.0\.1 
    ) 

도메인과 :

[a-z]$scheme*:/{2} 
    (?: 
     (?: 
      [a-z0-9\-._~!$&'($inline*+,;=:@|]+ 
     | 
      %[\dA-F]{2} 
     )+ 
    | 
     [0-9.]+ 
    | 
     \[ 
     [a-z0-9.]+ 
     : 
     [a-z0-9.]+ 
     : 
     [a-z0-9.:]+ 
     \] 
    ) 

이 같은 교체해야합니다 IP 주소 m atch 귀하의 웹 사이트. 분명히, 당신은 내가했던 줄 바꿈과 들여 쓰기를 제거해야 할 것입니다. 나는 당신을 위해 그것을 하겠지만, 당신이 힘든 시간을 당신이 당신의 모든 도메인의 중간에 놓는 자리를 찾을 수 있기 때문에 거의 가치가 있다고 생각합니다.

www.을 제외하고 하위 도메인이나 사람을 대상으로하는 정규식을 포함 할 수도 있습니다.

당신은이를 제거 할 수 있습니다 :

(?: 
     : 
     \d* 
    )? 

당신은 아마 도메인에서 다른 포트에 연결 명을 원하지 않기 때문에.

두 번째 것은 대략 동일한 구조를 가지고 있습니다. 덧글에 따르면 프로토콜 지정자가없는 URL을 얻는 것입니다.

+0

이 작품은 나를 위해! –

관련 문제