มีฟังก์ชั่น PHP ที่สามารถหลบหนีรูปแบบ regex ก่อนที่พวกเขาจะใช้?


162

มีฟังก์ชั่น PHP ที่สามารถหลบหนีรูปแบบ regex ก่อนที่พวกเขาจะใช้?

ฉันกำลังมองหาบางอย่างตามเส้นของRegex.Escape()ฟังก์ชันC #

คำตอบ:


255

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 "
// }

11
หนึ่งข้อสังเกตเพิ่มเติมเพื่อ@TomHaighคำตอบถ้าคุณไม่ได้ระบุที่สอง$delimiterอาร์กิวเมนต์preg_quote() มันจะไม่หลบหนีคั่นใด ๆ , ไม่ได้ "เริ่มต้น" /(หรือที่พบมากที่สุด)
Alix Axel

ฉันได้เพิ่มสิ่งต่าง ๆ ลงในคำตอบนี้ - บันทึกที่นำโดย @AlixAxel เกี่ยวกับความสำคัญของการ$delimiterโต้แย้งคำอธิบายของการโต้แย้งจากเอกสารการชี้แจงสำหรับความสับสนเกี่ยวกับสิ่งที่มันหมายถึงและหนัก ตัวอย่างที่แสดงความคิดเห็นแสดงให้เห็นว่าpreg_quoteมีการใช้งานในกรณีที่ง่ายที่สุดที่ฉันสามารถหาได้โดยที่มันถูกใช้เพื่อสร้าง regex โดยทางโปรแกรมแล้วนำไปไว้ในpreg_*ฟังก์ชั่นอื่น คุณสามารถย้อนกลับหากคุณไม่ชอบการเปลี่ยนแปลง
Mark Amery

1

มันจะปลอดภัยกว่าหากใช้รูปแบบการเตรียมจากห้องสมุด 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();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.