<code> $info = array( "https://segmentfault.com/q/1010000003711515", "http://www.baidu.com?admin.php&jasdhjas=asjd", 'php $a=0; echo "abc";', "假如这是第三个....*^%$#@!()[]{}", ); foreach ($info as $key => $value) { $message = "https://segmentfault.com/q/1010000003711515"; $preg = "/^".$value."$/"; if (preg_match($preg, $message)) { echo '匹配成功'; break; } }</code>
은 $info
배열을 순회하고 각 문자열 앞뒤에 /^
을 추가하며 $/
는 제공된 $message
과 일치하는 정규식이 되지만 $info
내부의 문자열 때문에 특수 문자가 있을 수 있습니다. 오류가 발생하므로 $info
의 각 문자열을 이스케이프 처리할 수 있는 방법이 있나요?
을 정의할 때만 $info
을 이스케이프할 수 있나요?
<code> $info = array( "https://segmentfault.com/q/1010000003711515", "http://www.baidu.com?admin.php&jasdhjas=asjd", 'php $a=0; echo "abc";', "假如这是第三个....*^%$#@!()[]{}", ); foreach ($info as $key => $value) { $message = "https://segmentfault.com/q/1010000003711515"; $preg = "/^".$value."$/"; if (preg_match($preg, $message)) { echo '匹配成功'; break; } }</code>
은 $info
배열을 순회하고 각 문자열 앞뒤에 /^
을 추가하며 $/
는 제공된 $message
과 일치하는 정규식이 되지만 $info
내부의 문자열 때문에 특수 문자가 있을 수 있습니다. 오류가 발생하므로 $info
의 각 문자열을 이스케이프 처리할 수 있는 방법이 있나요?
을 정의할 때만 $info
을 이스케이프할 수 있나요?
/
은 정규 표현식에서 특별한 의미를 가지므로, 뒤에 나오는 '/'를 사용하려면 앞에 백슬래시 를 추가해야 합니다.
$preg가 정의되었지만 $info가 사용되었습니다.
또한 일반 와일드카드는 로 이스케이프해야 합니다.
위의 예는
<code>$preg = "/^https:\/\/segmentfault\.com\/q\/1010000003711515$/"; $test = "https://segmentfault.com/q/1010000003711515"; preg_match($preg, $test);</code>
그냥 하고 싶은 말을 하는 게 더 나은 것 같아요. 생각이 잘못된 것 같아요.
$preg는 알 수 없는 변수입니다
전제가 너무 큽니다
이러한 표현을 프로그래머가 입력했다면 그건 프로그래머의 문제입니다.
사용자가 이러한 표현식을 입력하는 경우 사용자는 주의를 기울일 수 있도록 입력 인터페이스에서 정규 표현식임을 알려야 합니다.
js를 사용하여 정규 표현식의 특수 문자를 이스케이프할 수 있지만 두 번의 이스케이프가 발생할 수 있습니다(예를 들어 사용자가 원래 이스케이프된 콘텐츠 http:|b4831e42daf1db770cdbc01d41578e020|/를 입력했습니다.)
예
<code>document.getElementById('test').value = (new RegExp(document.getElementById('test').value)).toString();</code>
또한, 프로그램에 /^, $/를 강제로 추가하는 경우에도 문제가 발생할 수 있습니다.