มีฟังก์ชั่น PHP ที่สามารถหลบหนีรูปแบบ regex ก่อนที่พวกเขาจะใช้?
ฉันกำลังมองหาบางอย่างตามเส้นของRegex.Escape()
ฟังก์ชันC #
มีฟังก์ชั่น PHP ที่สามารถหลบหนีรูปแบบ regex ก่อนที่พวกเขาจะใช้?
ฉันกำลังมองหาบางอย่างตามเส้นของRegex.Escape()
ฟังก์ชันC #
คำตอบ:
preg_quote()
คือสิ่งที่คุณกำลังมองหา:
ลักษณะ
string preg_quote ( string $str [, string $delimiter = NULL ] )
preg_quote ()รับ
str
และวางแบ็กสแลชต่อหน้าอักขระทุกตัวที่เป็นส่วนหนึ่งของไวยากรณ์นิพจน์ทั่วไป สิ่งนี้มีประโยชน์หากคุณมีสตริงเวลาทำงานที่คุณต้องจับคู่ในข้อความและสตริงอาจมีอักขระพิเศษ regexอักขระนิพจน์ทั่วไปพิเศษคือ:
. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
พารามิเตอร์
STR
สตริงอินพุต
คั่น
หากมีการระบุตัวคั่นเพิ่มเติมตัวเลือกนั้นก็จะถูกหลบหนีไปด้วย สิ่งนี้มีประโยชน์สำหรับการหลบหลีกตัวคั่นที่จำเป็นสำหรับฟังก์ชั่น PCRE / เป็นตัวคั่นที่ใช้บ่อยที่สุด
สิ่งสำคัญโปรดทราบว่าหาก$delimiter
ไม่ได้ระบุอาร์กิวเมนต์ตัวคั่น - อักขระที่ใช้ล้อมรอบ regex ของคุณโดยทั่วไปจะเป็นเครื่องหมายทับหน้า ( /
) - จะไม่ถูกยกเว้น คุณมักจะต้องการส่งผ่านตัวคั่นใด ๆ ที่คุณใช้กับ regex ของคุณเป็น$delimiter
อาร์กิวเมนต์
preg_match
เพื่อค้นหาการเกิดขึ้นของ URL ที่กำหนดล้อมรอบด้วยช่องว่าง:$url = 'http://stackoverflow.com/questions?sort=newest';
// preg_quote escapes the dot, question mark and equals sign in the URL (by
// default) as well as all the forward slashes (because we pass '/' as the
// $delimiter argument).
$escapedUrl = preg_quote($url, '/');
// We enclose our regex in '/' characters here - the same delimiter we passed
// to preg_quote
$regex = '/\s' . $escapedUrl . '\s/';
// $regex is now: /\shttp\:\/\/stackoverflow\.com\/questions\?sort\=newest\s/
$haystack = "Bla bla http://stackoverflow.com/questions?sort=newest bla bla";
preg_match($regex, $haystack, $matches);
var_dump($matches);
// array(1) {
// [0]=>
// string(48) " http://stackoverflow.com/questions?sort=newest "
// }
$delimiter
โต้แย้งคำอธิบายของการโต้แย้งจากเอกสารการชี้แจงสำหรับความสับสนเกี่ยวกับสิ่งที่มันหมายถึงและหนัก ตัวอย่างที่แสดงความคิดเห็นแสดงให้เห็นว่าpreg_quote
มีการใช้งานในกรณีที่ง่ายที่สุดที่ฉันสามารถหาได้โดยที่มันถูกใช้เพื่อสร้าง regex โดยทางโปรแกรมแล้วนำไปไว้ในpreg_*
ฟังก์ชั่นอื่น คุณสามารถย้อนกลับหากคุณไม่ชอบการเปลี่ยนแปลง
มันจะปลอดภัยกว่าหากใช้รูปแบบการเตรียมจากห้องสมุด T-Regx :
$url = 'http://stackoverflow.com/questions?sort=newest';
$pattern = Pattern::prepare(['\s', [$url], '\s']);
// ↑ $url is quoted
จากนั้นดำเนินการแข่งขันt-regxปกติ:
$haystack = "Bla bla http://stackoverflow.com/questions?sort=newest bla bla";
$matches = $pattern->match($haystack)->all();
$delimiter
อาร์กิวเมนต์preg_quote()
มันจะไม่หลบหนีคั่นใด ๆ , ไม่ได้ "เริ่มต้น"/
(หรือที่พบมากที่สุด)