정규표현식으로 특정 부분 뽑아내기

sjpark의 이미지

[ code ]
import java.sql.*;
class jdbc {
public static void main(String argv[]) {
try {
Class.forName("org.gjt.mm.mysql.Driver");
System.out.println("jdbc 드라이버 로딩 성공");
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
}
try {
String url = "jdbc:mysql://localhost:3306/mysql";
Connection con = DriverManager.getConnection(url,"root","");
System.out.println("mysql 접속 성공");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select user from user where user=
'root'");
System.out.println("Got result:");
while(rs.next()) {
String no= rs.getString(1);
String tblname = rs.getString(1);
System.out.println(" no = " + no);
System.out.println(" tblname= "+ tblname);
}
stmt.close();
con.close();
} catch(java.lang.Exception ex) {
ex.printStackTrace();
}
}
}
[/ code ]

이런 코드에서 코드 태그 사이에 있는 것만 쏙 뽑아내는 정규식이 어떤것인가요..
제가 정규식에 서툴러서..영.. 아무리해도 답이 안나오네요..

phpbb 코드를 보긴 좀 그렇고..흠;
[/u][/i][/b]

정인철의 이미지

태그 없애는 방법은 언어마다 약간씩 다른다고 알고 있습니다.

대충 느낌은 다음처럼 하면 되지 않을까요?

s/<([^>]*)><//g

sjpark의 이미지

정인철 wrote:
태그 없애는 방법은 언어마다 약간씩 다른다고 알고 있습니다.

대충 느낌은 다음처럼 하면 되지 않을까요?

s/<([^>]*)><//g

답변 감사합니다.
그런데 저에게 생긴 문제는 제가 올린 예제를 보면

대가로 사이에 태그의 id가 들어가게 되요
code라는 대가로로 이루어진 태그 사이에 있는 문장들을 뽑아내서 별도의 치장(?)을 해준후 다시 출력해주려고 하거든요.

마치 phpbb에서 코드를 입력할때 사용하는 태그 같은것이에요.

                $text=ereg_replace(
                    "\[".$tag[id]."\](([^\[]{1}[^/]{1})*)\[/".$tag[id]."\]"
                    ,$tag[attr_start].$token.$tag[attr_end]
                    ,$text
                );

제가 쓴 코드는 저렇게 되요.
엉망진창이고 동작하지 않고 있지요.

"\[".$tag[id]."\](([^\[]*))\[/".$tag[id]."\]"

처음엔 이방법으로 했는데 잘 되더라구요.. 그래서 한숨 돌렸는데,
예제 코드 같은것이 나오니(코드안에서 배열로 대가로를 쓰기에..ㅜㅠ)

두번째로

"\[".$tag[id]."\](([^/]*))\[/".$tag[id]."\]"

를 했더니...
예제 코드 같은것에서 보면 주석을 쓸때 슬래시를 사용하니..ㅜㅠ

어찌해야 할지..
[ /code ]라는 단어(공백없이)를 만나기 전까지의 모든 스트링을 쏙 뽑아내고
싶은데....

방법이 없을까요..

단호진의 이미지

/begin/,/end/ 식의 범위를 항상 지정해줄 수 있을텐데요... 어떤 프로그램에서 정규표현을 처리할 것인가요?

:wq

sjpark의 이미지

단호진 wrote:
/begin/,/end/ 식의 범위를 항상 지정해줄 수 있을텐데요... 어떤 프로그램에서 정규표현을 처리할 것인가요?

PHP에요,
ereg_replace함수를 사용하려구요.
펄을 따라한 정규식도 지원되는듯 하긴 한데...
nohmad의 이미지

php면 preg_* 계열을 사용하는 것이 좋죠.
non-greedy 수량자를 쓰면

s@\[code\](.*?)\[/code\]@

이정도면 될 듯 하고, 룩어헤드를 쓰면

s@\[code\]((?!\[/code\]).*?)\[/code\]@

이렇게 하시면 될 것 같네요.

sjpark의 이미지

nohmad wrote:
php면 preg_* 계열을 사용하는 것이 좋죠.
non-greedy 수량자를 쓰면

s@\[code\](.*?)\[/code\]@

이정도면 될 듯 하고, 룩어헤드를 쓰면

s@\[code\]((?!\[/code\]).*?)\[/code\]@

이렇게 하시면 될 것 같네요.


            $text = preg_replace(
                "/\[".$tag[id]."\](.*?)\[\/".$tag[id]."\]/",
                $tag[attr_start]."\\1".$tag[attr_end],
                $text,
                -1
            );

이렇게 했는데... 안되네요..
단호진의 이미지

sjpark wrote:
[ code ]
import java.sql.*;
class jdbc {
public static void main(String argv[]) {
try {
Class.forName("org.gjt.mm.mysql.Driver");
System.out.println("jdbc 드라이버 로딩 성공");
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
}
try {
----------snip
[/ code ]
----------snip

궁굼해서 그러는데요... 한줄 한줄 입력으로 들어오는 건가요?
아니면 쟤네들이 몽땅 하나의 문자열에 들어오나요?

혹시 sed로 잠깐 처리해서 해버리면 안되나요? -n 선택 붙여서 실행하면
[ code ]와 [\ code ] 사이의 것들을 출력합니다. 추가적인 조작도 할 수
있겠죠... 외부 함수 호출을 잠깐 하는 것도 고려해볼 듯...

/\[ code \]/,/\[\/ code \]/ {
    s/\[[\/ ]*code \]/0/
    p
}

:wq

sjpark의 이미지

도와주셔서 감사합니다.

이곳에 리플 달린 힌트를 보고 관련된걸 찾다 보니..
몇가지 좋은 방법 있길레 써보았습니다.

            $patterns = "#\[".$tag[id]."\](.*?)\[/".$tag[id]."\]#si";
            $callback = create_function(
                '$matches',
                '$inner_data = unserialize(stripslashes("'. addslashes(serialize($tag)) .'")); return $inner_data[attr_start].htmlspecialchars($matches[1]).$inner_data[attr_end];'
            );
            $text=preg_replace_callback($patterns, $callback, $text);

신경써주셔서 감사합니다. ;)

ps. 참 들어오는건 한꺼번에 하나의 스트링으로 들어와요.. DB에서 text필드를 읽어 오거든요.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.