iT邦幫忙

1

怎麼動態處理regular expression字串(PHP)

php

如想要用sprintf動態替換%s,如何做到?
像這類regular expression字串動態處理的方式,該如何google,
因為都只查到regular expression的用法
不考慮replace的方式

  $regex = '/.*?<a name="%s">(.*?)<a name="%s">/is';
看更多先前的討論...收起先前的討論...
TB iT邦新手 4 級 ‧ 2018-10-20 11:15:32 檢舉
請參考
http://php.net/manual/zh/ref.pcre.php
weiclin iT邦高手 4 級 ‧ 2018-10-20 12:05:34 檢舉
就 $regex = sprintf('/.*?<a name="%s">(.*?)<a name="%s">/is', $name);
@weiclin 就是這作法不行,所以才上來詢問,字串是不是需要經過另外處理,才能這樣使用?
@TB 能說一下怎麼用你說的作法處理嗎?
weiclin iT邦高手 4 級 ‧ 2018-10-20 13:15:03 檢舉
怎樣個不能用法, 說明一下
weiclin iT邦高手 4 級 ‧ 2018-10-20 13:18:58 檢舉
下面這個可以啊, 你怎麼用的貼出來吧
$regexp = sprintf('/^%s/', "abc");
var_dump(preg_match($regexp, '123 abc'));
var_dump(preg_match($regexp, 'abc 123'));
你用我的例子去試就知道了
weiclin iT邦高手 4 級 ‧ 2018-10-20 15:30:07 檢舉
你的例子:
$regexp = sprintf('/.*?<a name="%s">(.*?)<a name="%s">/is', "foo", "bar");
echo "regexp is '$regexp'\n";
$string = '<body><a name="foo">link foo</a><a name="bar">link bar</a></body>"';
echo preg_match($regexp, $string)? "match" : "not-match", "\n";

結果:
regexp is '/.*?<a name="foo">(.*?)<a name="bar">/is'
match

好好的啊, 所以我說你要不要把你的程式貼完整一點
取代的字串有特殊符號造成的~

1 個回答

3
marlin12
iT邦新手 3 級 ‧ 2018-10-20 13:18:55
最佳解答
<?php
    $url1 = '/blog';
    $url2 = '/about';
    $template = '/.*?<a href="%s">(.*?)<\/a><a href="%s">/is';
    $pattern = sprintf($template, preg_quote($url1,'/'), preg_quote($url2,'/'));
    echo 'pattern = ' . htmlspecialchars($pattern) . '<br/>';

    $subject = '<a href="/">HOME</a><a href="/blog">BLOG</a><a href="/about">ABOUT</a>';
    echo 'subject = ' . htmlspecialchars($subject) . '<br/>';

    preg_match($pattern, $subject, $matches);
    echo 'matches[1] = ' . htmlspecialchars($matches[1]) . '<br/>';
?>    

原來要取代的字串,要先用preg_quote處理過,才能避免特殊符號的影響?

marlin12 iT邦新手 3 級 ‧ 2018-10-20 22:28:45 檢舉

對唷

我要發表回答

立即登入回答