php
  • regex
  • 2013-05-03 151 views 4 likes 
    4

    我有被加载到标题文字的质量,并在它位于此链接。正则表达式/通配符在字符串替换PHP

    <link rel="canonical" href="could_be_anything_here_at_all" /> 
    

    我正在寻找新的价值取代它,但href基于页面意思是一个简单的str_replace变化是不可能的。

    我看过使用了preg_replace,但不能让我的头围绕什么,似乎是一个简单的问题。

    $regex = '/(^<link rel="canonical")(\/>$)/'; 
        $match = preg_match_all($regex, $content, $matches); 
        var_dump($matches); 
    
    • 的/ /开始和结束的表达?
    • The()表示单独的'表达式'必须与要返回的字符串匹配吗?
    • ^以下列字符串开头的结果筛选器?
    • 用于以下列字符串结尾的结果$筛选器?

    所以我在寻找与<link rel="canonical"开始,以/>

    我展示了我以后的步骤,我在它刺结束的字符串。请帮我写,并最终了解如何去做。这件事我真的很茫然。

    +2

    +1就如何提出对SO – michi 2013-05-03 01:04:54

    +0

    处理HTML上即时的响应很好的例子是一个坏主意。最好的解决方案是改变它定义的HTML。你看过它的定义吗? – 2013-05-03 01:11:13

    回答

    2

    你写的正则表达式是所有的地方。让我们在图案:

    无论发生什么,它会与<link开始,以></link>/>(总得占那些讨厌的非尊重-的标准的网站海盗)结束。你正在寻找rel参数,如果它有一个,它需要是规范的。

    我们可以开始写正则表达式:#<link([^>]+)(/>|></link>)#is。这将映射所有link标签。然后,您可以使用简单的strpos调用来解析参数。

    如果您确信的rel =“规范”将是link标签的第一个参数,可以进一步扩大正则表达式为#<link rel="canonical" href="?'?([^"']+)"?'?(/>|></link>)#is。这将按顺序映射它,如果您确定这将是订单,那很好。

    出场顺序:

    [^>]+匹配任何不是一个>字符一次或多次

    is标志代表:不区分大小写,不要换行打破

    "?'?比赛0或一个“,然后是0或1'

    如果还有什么不清楚的地方,请告诉我。

    编辑:回答你的问题

    • 的/ /开始和结束的表达? 它们被称为分隔符,它们“包住”表达式。Perl正则表达式引擎允许针对表达式(i,s,g,b等)设置标志,并且这些标志必须超出表达式。他们追随分隔符 - 这是分隔符的要点。你可以使用任何你喜欢的角色 - 它会选择最远的两个重复的角色。人们倾向于使用/由于JS为他们使用单个字符 - 我倾向于使用PHP中的#来清除/结束HTML标记引起的歧义。

    • ()表示单独的'表达式'必须与要返回的字符串相匹配吗? ()与子集匹配,并允许您在指定匹配变量时将其返回到结果中。正则表达式的每一个部分都可以使用通配符&合作,但只有在(包裹的东西)将在比赛

    • 的^过滤器以下列字符串开头的结果返回? 没有。 ^范围外的^将匹配任何开始与以下字符串句号。实际上,不仅仅是“言语”,而是在新的路线上。
    • 用于以下列字符串结尾的$ filters结果? 同上,只是“结束”而不是“开始”。
    +0

    非常感谢!正是我在找什么。 – 2013-05-03 06:23:13

    +0

    @MarkPurnell:顺便提一下,perl兼容的正则表达式引擎使用了更多的符号。值得一读 - 如果使用得当,这些东西无限强大。 – 2013-05-03 12:26:49

    1

    快速注释:不建议使用正则表达式解析HTML,而是使用DomDocument或其他“DOM解析”附加组件解析HTML。但由于这是只用1句话串,这是我会怎么处理它:

    <?php 
    // base string 
    $str = '<link rel="canonical" href="could_be_anything_here_at_all" />'; 
    
    // for preg_replace 
    $preg_replace = '<link rel="canonical" href="'.preg_replace('/<link rel="canonical" href="(.*)" \/>/','MY_NEW_LINK',$str).'" />'; 
    echo $preg_replace; 
    
    // preg_match_all 
    preg_match_all('/<link rel="canonical" href="(.*)" \/>/',$str,$preg_match); 
    echo '<pre>',print_r($preg_match),'</pre>'; // process as you wish 
    

     相关问题

    • 暂无相关问题^_^