PHP preg_replace 의 정규표현식 문제입니다.

ctcquatre의 이미지

php school에서 답을 구해봤는데 예상했던 답이 구해지지 않아
여기에 다시 글을 포스트 합니다.

$ret = preg_replace("/\[\:url\s*\=\s*(http|https)\:\/\/([\w\/\.\?\-\#\=\&]+)\]/i","<a href='\${1}://\${2}' target='_new' style='" . $style . "'>\${1}://\${2}</a>",$str);

위와 같이 정규표현식을 구성했습니다.

역할은
[:url=http://www.abc.com?index=17&no=1234]
같은 텍스르를 링크로 바꿔주는 것입니다.
전부다 되는데 텍스트 내용에 & 문자만 들어가면 패턴이 일치하지 않습니다.
분명 위에 \&를 썼는데도 말이죠.

즉 예를 들면

[:url=http://www.abc.com?index=17?_-no=1234]
이런 주소들은 전부다 링크가 걸립니다.
하지만
주소에 &만 들어가면 패턴불일치가 되버리는군요.

ps: 오늘 아침에 차타고 학교 오는데 가을 분위기가 물씬 풍기네요.
아.. 남자의 마음이... :)

leigh의 이미지

올려주신 코드로 테스트해보니 링크가 만들어지는데요? 뭐가 문제이신 건지.... :shock:

...

maindb의 이미지

잘 되는데요... :shock:

jeweljar의 이미지

패턴을 보니 ']'가 나오면 URL 주소가 끝났음을 말하는 것 같은데
([\w\/\.\?\-\#\=\&]+)
대신에
([^\]]+)
를 써보는건 어떻겠습니까?

ctcquatre의 이미지

흑.. 왜 나는 안돼는지..
설마 버젼문제일리는 절대 없을테고..

([\w\/\.\?\-\#\=\&]+)
부분이 안먹어서
(\S+) 로 하니까 되기는하는데..

jeweljar님의 ([^\]]+)는 그렇게 써볼까도 했는데..
위와 같이 url에 올수있는 문자를 명시하는 이유는
url에 깔끔한 처리를 위해서 입니다.

끝에 실수로 ]를 안붙여줘도 url이 끝나는대로 다른 문자에는 영향을 안받게
말이죠..

아.. 오늘 다시 테스트해봐야겠습니다..

Chaos to Cosmos,
Chaos to Chaos,
Cosmos to Cosmos,
Cosmos to Chaos.

ctcquatre의 이미지

이런.. 좀더 확인을 했어야 하는데 죄송합니다.. --;
몇개월 전에 짜놓은 소스를 수정하다보니

function deny_html($str) 		{
			$trans = array("&" => "&amp;", "\"" => "&quot;", "'" => "'", "<"=>"&lt;", ">"=>"&gt;"); 
			$str = strtr($str, $trans); 

			return $str;
		}

이렇게 &를 &amp;로 치환해서 저장해놓고 읽을때 preg_replace를 썼네요.

오늘 다른 분들이 된다시길래... 왠지 이럴것 같다는 느낌이 들더니만..
결국은.. 요즘 왜 이러는지
도와주셔서 감사합니다.

Chaos to Cosmos,
Chaos to Chaos,
Cosmos to Cosmos,
Cosmos to Chaos.

lifthrasiir의 이미지

ctcquatre wrote:
흑.. 왜 나는 안돼는지..
설마 버젼문제일리는 절대 없을테고..

([\w\/\.\?\-\#\=\&]+)
부분이 안먹어서
(\S+) 로 하니까 되기는하는데..

jeweljar님의 ([^\]]+)는 그렇게 써볼까도 했는데..
위와 같이 url에 올수있는 문자를 명시하는 이유는
url에 깔끔한 처리를 위해서 입니다.

끝에 실수로 ]를 안붙여줘도 url이 끝나는대로 다른 문자에는 영향을 안받게
말이죠..

아.. 오늘 다시 테스트해봐야겠습니다..

<del>
혹시 preg_replace를 호출하기 전에 htmlspecialchars 같은 게 호출된 게 아닐까요? 그렇게 된다면 &는 &amp;로 바뀌고 ;가 정규식에 들어 있지 않기 때문에 match에 실패할 겁니다.
</del>

커헉. 창 켜 놓고 다른 글 답변한 뒤에 이 글을 답변해 놓고 나니까 위에 뭔가가... orz

그나저나, 주어진 정규표현식만으로 모든 url이 제대로 표시되지는 않을 것 같습니다. 적어도 @ ~ % (저는 여기에 , : ;까지 넣어서 사용합니다) 정도는 더 넣어 줘야 할 것 같아 보이네요.

- 토끼군

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.