将Perl正则表达式转换为PHP

时间:2017-06-08 14:42:52

标签: php perl

我有以下Perl代码:

$url=~s/\W//g;

我想将其翻译为PHP preg_replace

preg_replace("/[\W]/", "", $url);

我不确定这是否正确。我真的不知道它的作用。

它来自此功能,它将URL格式化为规范格式:

sub formatcanonical {
    my $url = lc(shift);

    $url =~ s/-/ /g;
    $url =~ s/\s+/_/g;
    $url =~ s/\W//g;

    return $url;
}

2 个答案:

答案 0 :(得分:0)

Perl代码

$url=~s/\W//g;

$url匹配\W(非word字符)中的所有字符替换为空白,并将结果分配回$url变量。

等效的PHP代码:

$url = preg_replace('/\W/', '', $url);

可以通过4 th 参数($limit)设置最大可能替换次数。默认情况下,$limit等于-1(无限制)。所以替换是全局执行的(Perl代码使用g修饰符来实现)。

注意," word"的定义取决于当前的区域设置(请参阅Escape Sequences):

  

A"字"字符是任何字母或数字或下划线字符,   也就是说,任何可以成为Perl" word"的一部分的角色。该   字母和数字的定义由PCRE的字符控制   表,并且如果发生特定于语言环境的匹配,则可能会有所不同。对于   例如,在" fr" (法语)语言环境,一些字符代码更大   超过128用于重音字母,这些字母由\ w。

匹配

答案 1 :(得分:-1)

在问之前一定要试试,如果你走得这么远,你可以想出来。

除此之外,你不需要[]&#39。当移动到php时,正则表达式本身并没有改变(或者至少对于常见的东西,当它看起来像php has a page列出所有差异时)。但是从我所看到的,无论哪种方式都应该正确。字符集仅在有多个字符时才有用。在正文中,正则表达式执行此操作:

  1. 用空格替换破折号。
  2. 使用单个下划线替换任何连续长度的空格。
  3. 替换任何非单词字符。其中包括a-zA-Z0-9_以及其他一些特殊/ unicode字符,例如ëè等.Capital \ W否定\ w匹配的位置字符。
  4. 其次不要改变它的令人困惑的顺序(如果你真的在代码中这样做,它会赢得并没有按预期回来)。

    第三,PHP允许数组作为preg_replace的参数。

    所有人都可以这样做:

    $string = 'Hello im a test-able string!';
    echo preg_replace(
        [
            '/-/',
            '/\s+/',
            '/\W/',
        ],
        [
            ' ',
            '_',
            '',
        ],
        $string
    );
    

    虽然可读性仍然有点可疑。人们可能会选择三个preg_replace函数,特别是一旦它们变得冗长。

    最后,如果您需要一个正则表达式测试的游乐场,请尝试regex101,这很棒。

    此外,您在我输入内容时进行了3次修改,我现在暂时不予理睬。