我很讨厌正则表达式。我正在尝试替换为:
public static function camelize($word) {
return preg_replace('/(^|_)([a-z])/e', 'strtoupper("\\2")', $word);
}
与带有匿名函数的preg_replace_callback一起使用。我不知道\\
2在做什么。或就此而言,preg_replace_callback的工作方式完全一样。
实现该目标的正确代码是什么?
在正则表达式中,您可以使用(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中的任何回调,如
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
is 代替/e
正则表达式上的修饰符,因此您需要从“ pattern”参数中删除该标志。这样的模式/blah(.*)blah/mei
就会变成/blah(.*)blah/mi
。/e
改性剂中使用的变体addslashes()
上的内部参数,所以一些替代用于stripslashes()
将其取出; 在大多数情况下,您可能希望stripslashes
从新的回调中删除对的调用。问题内容: 我有以下错误: 警告:preg_replace():第38行上xxx.php中的未知修饰符’]’ 这是第38行的代码: 我该如何解决这个问题? 问题答案: 为什么会发生错误 在PHP中,正则表达式需要包含在一对定界符内。分隔符可以是任何非字母数字,非反斜杠,非空格字符;,,是最常用的。需要注意的是,还可以使用支架风格分隔符在打开和关闭括号开始和结束的分隔符,即,等等都是有效的。 在以下
我正在努力将图像标记转换为链接并复制标记内的参数,即。 进入 我的问题不仅仅是复制src和alt数据,还包括丢失和额外的标记。 进入 和 进入 这需要对整个字符串中img标记的所有实例执行。 不是说听起来像是一个挑战,但是有人能提出一个可能的解决方案吗,我相信这可以用preg_replace但是我就是做不到? 非常感谢。
问题内容: 这个问题已经在这里有了答案 : 用preg_replace_callback替换preg_replace()e修饰符 (3个答案) 4年前关闭。 上面的代码在升级到PHP 5.5后给出了弃用警告: 不推荐使用 :preg_replace():不推荐使用/ e修饰符,而应使用preg_replace_callback 如何用替换代码? 问题答案: 您可以使用匿名函数将匹配项传递给函数:
private private修饰符是我们使用的最限制的修饰符。它表示它只能被自己所在的文件可见。所以如果我们给一个类声明为private,我们就不能在定义这个类之外的文件中使用它。 另一方面,如果我们在一个类里面使用了private修饰符,那访问权限就被限制在这个类里面了。甚至是继承这个类的子类也不能使用它。 所以一等公民,类、对象、接口……(也就是包成员)如果被定义为private,那么它们只
我正在自己学习Java,并使用在线练习进行练习。到目前为止,我只学到了直到方法,所以在这个练习中使用数组超出了我的范围,即使一些在线解决方案使用数组来做我想做的事情。 练习是这样的:让用户输入一个带有元音的字符串。只要有元音字母,就将该元音显示为大写字母。 例如:如果用户输入“苹果”,正确的输出是苹果 到目前为止,我有这段代码: 当我运行我的代码时,例如,输入字符串“苹果”,我得到“苹果”作为我的
主要内容:VB.Net修饰符列表修饰符是添加了任何编程元素的关键字,以特别强调编程元素在程序中的行为或将被访问 例如,访问修饰符:, , , , 等指示编程元素的访问级别,如:变量,常量,枚举或类。 VB.Net修饰符列表 下表提供了VB.Net修饰符的完整列表: 编号 修饰符 描述 1 指定Visual Basic应将所有字符串封送到美国国家标准学会(ANSI)值,而不管正在声明的外部过程的名称如何。 2 指定源文件开始处的属