亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用preg_替換_callback替換preg_替換()e修飾符

用preg_替換_callback替換preg_替換()e修飾符

楊魅力 2019-05-31 10:58:20
用preg_替換_callback替換preg_替換()e修飾符我不擅長正則表達式。我在試著替換這個:public static function camelize($word) {    return preg_replace('/(^|_)([a-z])/e', 'strtoupper("\\2")', $word);}使用帶有匿名函數的preg_reve_callback。我不明白\2在做什么?;蛘?,對于這個問題,preg_reve_callback到底是如何工作的。實現這一目標的正確代碼是什么?
查看完整描述

1 回答

?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

在正則表達式中,可以使用(brackets);在本例中,您將捕獲(^|_)([a-z])比賽的一部分。這些都是從1開始編號的,因此您有反向引用1和2。匹配0是整個匹配的字符串。

這個/e修飾符接受一個替換字符串,并替換反斜杠,后面跟著一個數字(例如,\1)使用適當的反向引用-但是由于您在字符串中,需要轉義反斜杠,所以'\\1'。然后(實際上)運行eval以PHP代碼的形式運行生成的字符串(這就是不推薦它的原因,因為它易于使用eval(以一種不安全的方式)。

這個preg_replace_callback函數將接受回調函數,并將其傳遞給包含匹配的回退引用的數組。所以你會在哪里寫'\\1',而是訪問該參數的元素1-例如,如果您具有窗體的匿名函數function($matches) { ... },第一個反向引用是$matches[1]在這個功能里面。

所以/e爭論

'do_stuff(\\1) . "and" . do_stuff(\\2)'

可能會成為

function($m) { return do_stuff($m[1]) . "and" . do_stuff($m[2]); }

或者在你的情況下

'strtoupper("\\2")'

可能變成

function($m) { return strtoupper($m[2]); }

請注意$m$matches它們不是神奇的名稱,它們只是我在聲明回調函數時給出的參數名稱。另外,您不必傳遞一個匿名函數,它可以是一個字符串的函數名,也可以是某種形式的函數名。array($object, $method)與PHP中的任何回調一樣,G.

function stuffy_callback($things) {
    return do_stuff($things[1]) . "and" . do_stuff($things[2]);}$foo = preg_replace_callback('/([a-z]+) and ([a-z]+)
    /', 'stuffy_callback', 'fish and chips');

與任何函數一樣,默認情況下不能訪問回調(從周圍的作用域)之外的變量。使用匿名函數時,可以使用use關鍵字導入需要訪問的變量,正如PHP手冊中所討論的那樣。如果舊的論點是

'do_stuff(\\1, $foo)'

那么新的回調可能看起來就像

function($m) use ($foo) { return do_stuff($m[1], $foo); }

格查斯

  • 使用

    preg_replace_callback

    而不是

    這個

    /e

    正則表達式上的修飾符,因此您需要從“模式”參數中移除該標志。所以像這樣的模式

    /blah(.*)blah/mei

    會變成

    /blah(.*)blah/mi.

  • 這個

    /e

    修飾語使用的變體

    addslashes()

    內部的參數,所以一些替換使用

    stripslashes()

    若要刪除它;在大多數情況下,您可能希望刪除對

    stripslashes

    你的新電話。


查看完整回答
反對 回復 2019-05-31
  • 1 回答
  • 0 關注
  • 603 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號