묻고답하기
page_full_width" class="col-xs-12" |cond="$__Context->page_full_width">
PHP 정규표현식 해석 부탁드립니다. (행복한 고니님께)
2003.09.04 09:43
첫번째 질문
http://us4.php.net/manual/en/function.preg-match-all.php을 보다가 궁금해서 말입니다. 예제 2번에 나오는 내용입니다.
<b>bold text</b><a href=howdy.html>click me</a>을 찾고자 하는데
"/(<([w]+)[^>]*>)(.*)(</\2>)/" 어떻게 이런 정규식이 만들어지는지 해석해 주실 수 있는지요?
두번째 질문
<a href="/q?s=[A-Z.]{3,}&d=t">[A-Z.]{3,}</a>
으로 http://finance.yahoo.com/mnpg?e=o
페이지에서 맨 왼쪽의 Symbol만을 검색해 보았습니다.
있어야 할 값은 십여개가 넘는데 왜 4개 -5개만 검색이 되는지 모두를 다 검색하고자 하면 어떻게 해야 하는지 말입니다. 소스보기로 확인하면 모든 심볼이 같은 형식을 같고 있음에도 불구하고 앞부분 몇개만 검색이 되는지.....
검색에 사용한 소스입니다.
$pattern = "|<a href="/q?s=[A-Z.]{3,}&d=t">[A-Z.]{3,}</a>|m";
$url="http://finance.yahoo.com/mnpg?e=o";
// read file
$fp=fopen($url,"r");
$page= fread ($fp, 10000000);
fclose($fp);
preg_match_all ($pattern, $page, $matches);
for ($i=0; $i< count($matches[0]); $i++) {
echo "matched: ".$matches[0][$i]."<br>";
echo "part 1: ".$matches[1][$i]."<br>";
echo "part 2: ".$matches[3][$i]."<br>";
echo "part 3: ".$matches[4][$i]."<br><br>";
}
조언 부탁드립니다.
http://us4.php.net/manual/en/function.preg-match-all.php을 보다가 궁금해서 말입니다. 예제 2번에 나오는 내용입니다.
<b>bold text</b><a href=howdy.html>click me</a>을 찾고자 하는데
"/(<([w]+)[^>]*>)(.*)(</\2>)/" 어떻게 이런 정규식이 만들어지는지 해석해 주실 수 있는지요?
두번째 질문
<a href="/q?s=[A-Z.]{3,}&d=t">[A-Z.]{3,}</a>
으로 http://finance.yahoo.com/mnpg?e=o
페이지에서 맨 왼쪽의 Symbol만을 검색해 보았습니다.
있어야 할 값은 십여개가 넘는데 왜 4개 -5개만 검색이 되는지 모두를 다 검색하고자 하면 어떻게 해야 하는지 말입니다. 소스보기로 확인하면 모든 심볼이 같은 형식을 같고 있음에도 불구하고 앞부분 몇개만 검색이 되는지.....
검색에 사용한 소스입니다.
$pattern = "|<a href="/q?s=[A-Z.]{3,}&d=t">[A-Z.]{3,}</a>|m";
$url="http://finance.yahoo.com/mnpg?e=o";
// read file
$fp=fopen($url,"r");
$page= fread ($fp, 10000000);
fclose($fp);
preg_match_all ($pattern, $page, $matches);
for ($i=0; $i< count($matches[0]); $i++) {
echo "matched: ".$matches[0][$i]."<br>";
echo "part 1: ".$matches[1][$i]."<br>";
echo "part 2: ".$matches[3][$i]."<br>";
echo "part 3: ".$matches[4][$i]."<br><br>";
}
조언 부탁드립니다.
댓글 5
-
행복한고니
2003.09.04 13:26
-
행복한고니
2003.09.04 13:29
두번째 질문에 대한 대답
----------------------------------------------------------
파일은 확실히 다 넘어오던가요?
$page 변수부터 확인해보세요. -
행복한고니
2003.09.04 13:29
궁금한데 ㅡ.ㅡ;;
근데 왜 제가 지목된거였죠?? -
스티치*FREE*
2003.09.04 21:19
고니님 대략 인기인^^ -
윤 만식
2003.09.04 22:18
지난 번 정규식 강의를 보았습니다.
정규식에 대해 많은 지식이 있으신 것 같아 질문을 드렸는데 예상이 맞아 떨어졌군요.
답변에 감사드립니다.
두번째 질문에서... 파일은 확실히 넘어옵니다. 그런데 왜 다 읽을 수 없는 것인지....
어떤 페이지는 확실히 읽어주지만 어떤 페이지는 그렇지 못하더군요.
테스트 좀 해 주십시오.
고맙습니다.
---------------------------------------------------------
\w 이것은 숫자, 영문, 그리고 언더스코어(_) 입니다.
그럼 ([\w]+) 이것은 숫자와 영문, 그리고 언더스코어로 이루어진 어떤 단어를 지칭하죠.
사실 (\w+) 이렇게 해도 됩니다.
그 이후에 [^>] 요 부분은 > 이것이 아닌 문자(문자에는 공백, 특수문자, 심지어 줄바꿈도 포함될 수 있습니다)를 말합니다. * 라는 것은 0개 이상이라는 것입니다. 즉, 있을 수도 있고 없을 수도 있다는 것이며, 있다면 1개 이상이라는 말입니다.
두 가지를 종합해보죠.
< 이것과 > 이것사이에 있으며, 첫부분은 반드시 영문숫자로 이루어진 단어 그리고 >이 되기전에 또 어떤 무엇인가가 올 수 있다. -> 즉, 태그를 말합니다. 완벽하게 맞아떨어지는 것은 아니지만, 이정도면 충분합니다.
점(.)은 그 어떤 문자도 될 수 있습니다. 아스키코드 0번부터 255번까지 모두를 말합니다. (.*) 과 같이 쓴다는 것은 어떤 문자가 되었건 1개이상 있을 수도 있고, 없을 수도 있다는 겁니다.
그리고 뒷부분의 \\2 에 대해서 말씀드리면 그건 back reference 라고 부르는 겁니다. 서브패턴(괄호로 둘러싼 것)이 일치하는 부분을 다시 참조하죠. 조금 더 매뉴얼을 자세히 보셨다면 패턴 1번은 (<([\w]+)[^>]*>) 이 부분, 패턴 2번은 그 속의 ([\w]+) 이 부분임을 알 수 있으실 겁니다. 흔히 쓰는 태그를 생각해보면 <a href="~~~">링크</a> 와 같은 식으로 정규식의 ([\w]+) 이 부분을 다시 닫는 태그에 사용한다는 사실을 알 수 있습니다.
저 패턴에 일치하는 것을 찾으라면 <b>bold text</b> 이 부분이 하나 <a href=howdy.html>click me</a> 그리고 이 부분이 또 하나가 됩니다. 단, 닫는 태그가 없는 태그들은(br, hr, img 등등) 패턴에 일치하지 않겠죠. ^^