2010-04-07 8 views
1
$regexp = '/(?:<input\stype="hidden"\sname="){1}([a-zA-Z0-9]*)(?:"\svalue="1"\s\/>)/'; 
$response = '<input type="hidden" name="7d37dddd0eb2c85b8d394ef36b35f54f" value="1" />'; 
preg_match($regexp, $response, $matches); 

echo $matches[1]; // Outputs: 7d37dddd0eb2c85b8d394ef36b35f54f 

그래서이 정규 표현식을 사용하여 스크립트 로그인을 수행하기 위해 Joomla를 구현하는 웹 페이지에서 인증 토큰을 검색합니다.정규 표현식과의 잘못된 일치

나는이 모든 작업을하고 있지만 항상 2 개의 항목을 반환하므로 내 정규 표현식에 어떤 문제가 있는지 궁금합니다.

Array ([0] => [1] => 7d37dddd0eb2c85b8d394ef36b35f54f) 

또한 입력 할 페이지의 이름은 길이와 이름이 모두 변경됩니다. preg_match의 수동 입력으로 당

답변

3

아무런 문제가 없습니다. 항목 [0]에는 항상 전체 일치 항목이 포함됩니다. the docs (강조 광산)에서 : matches가 제공

경우, 다음 검색 결과로 가득 입니다. $matches[0]는 전체 패턴, $matches[1] 등등 첫번째 캡처 한 이 서브 패턴을 괄호 일치, 텍스트를해야합니다 일치하는 텍스트가 포함됩니다.

정규식을 사용하여 정규식을 사용하는 정규식을 간과하는 정규식은 너무 복잡합니다.

$regexp = '#<input\s+type="hidden"\s+name="([0-9a-f]*)"\s+value="1"\s*/>#i' 
  • 당신은 전혀 비 캡처 그룹을 필요가 없습니다.
  • \s을 사용하면 한글자로 제한됩니다. \s+ 일 가능성이 있습니다.
  • 정규식 경계에서 /과 다른 것을 사용하면 정규식에서 슬래시를 이스케이프 처리하지 않아도됩니다.
  • 대/소문자를 구분하지 않고 대/소문자를 구분하는 것도 유용 할 수 있습니다.
  • auth 토큰은 16 진수 문자열처럼 보이므로 일치하는 a-z은 필요하지 않습니다.
+0

고맙습니다. 귀하의 정규식을 읽는 것이 더 쉬워 보이고 정규식과 일치하는 HTML을하지 않아도된다는 것을 안다. 그러나 이것은 대범한 것처럼 보였다. – Ballsacian1

+0

@ Ballsacian1 : 장례식입니다. ;-) DOMDocument :: loadHTML을 살펴보고 DOM과 XPath로이 문제를 해결하는 것은 가치가 있습니다. – Tomalak

0

:

일치가 제공되는 경우, 다음이 검색 결과로 채워진다. $ matches [0]에는 전체 패턴과 일치하는 텍스트가 포함되고 $ matches [1]에는 첫 번째 캡처 된 괄호 안의 하위 패턴과 일치하는 텍스트가 포함됩니다.

+1

'[0] => [1]'은 사실 (웹 페이지 소스에서)'[0] =>' '[1] =>' – Arkh

관련 문제