2013-12-24 44 views
0

我需要帮助正则表达式在PHP中...“jolly char”在字符串替换中。这是我现在有:PHP:用字符串替换字符串里面的欢乐字符

$String = str_replace('<audio type="soundcloud">'. 
    '[soundcloud url="https://api.soundcloud.com/tracks/', 
    '<audio type="soundcloud">', $String); 

$String = str_replace(' params="color=ff6600&auto_play=false&'.  
    'show_artwork=true" width="100%" height="166" iframe="true" /]</audio>', 
    '</audio>', $String); 

输入是:

[soundcloud url="https://api.soundcloud.com/tracks/audio_id" params="color=ff6600&auto_play=false&show_artwork=true" width="100%" height="166" iframe="true" /] 

输出是:

<audio type="soundcloud">audio_id</audio> 

那没关系只有param保持不变(我想匹配任何param值)

现在,我试图用正则表达式来解决它。

这是我想什么来代替:

[soundcloud url="https://api.soundcloud.com/tracks/audio_id" params="*] 

...以有这样的:

<audio type="soundcloud">audio_id</audio> 

(我不需要保存任何参数,时刻)

所以,我不得不删除PARAMS之间的任何字符=”和]。

有人能帮助我吗? 我保证我会学习,在下一个愚蠢的问题之前! :)


编辑#1:

我为我不清楚的问题道歉,我试图解释它以另一种方式。 这是我在输入:

[soundcloud url="https://api.soundcloud.com/tracks/123456789" params="color=ff6600&auto_play=false&show_artwork=true" width="100%" height="166" iframe="true" /] 

这正是我所需要的输出:

<audio type="soundcloud">123456789</audio> 

...其中:

  • “123456789” 的变化,且必须保存。
  • 我必须删除“参数”和“]”(包括)之间的所有文本。

我想我需要的最终标志,所以我必须在正则表达式来写“PARAMS”的地方......


编辑#2:

这是我最后一次尝试:

$String = preg_replace('\<audio type="soundcloud"\>\[soundcloud url=\"https\:\/\/api.soundcloud.com\/tracks\/([^"]+).*.\<\/audio\>', '<audio type="soundcloud">\1</audio>', $String); 

...它在regex101.com演示中工作,但它不在我的页面中。


编辑#3:

固定! 当然你的答案是正确的......我在编辑#2中遇到了两个缺少的斜线麻烦!

这是正确的版本:

$String = preg_replace('/\<audio type=\"soundcloud\"\>\[soundcloud url=\"https\:\/\/api.soundcloud.com\/tracks\/([^"]+).*.\<\/audio\>/', '<audio type="soundcloud">\1</audio>', $String); 

非常感谢您的帮助......新年快乐!

+1

好的,我会对此采纳你的言论......但请问你可以编辑你的问题,并清楚输入是什么,预期输出是什么? – Enissay

+0

Mh ...我认为你是对的! :) 我刚编辑我的问题,对不起。 – user3131164

+0

你检查我的答案了吗? “我必须在正则表达式的某个地方写”params“,这是什么意思,你也想捕获它吗? – Enissay

回答

0

你的正则表达式将是\[soundcloud url="https://api\.soundcloud\.com/tracks/([^"]*?)"([^\]]*?)\]

,你可以使用preg_replace这样

$String = preg_replace('/\\[soundcloud url="https:\/\/api\\.soundcloud\\.com\/tracks\/([^"]*?)"([^\]]*?)\\]/', 
    '<audio type="soundcloud">$\1</audio>') 
+0

Mh ...这不起作用... “audio_id”应该只在以下之间: [soundcloud url =“https://api.soundcloud.com/tracks/” AND params =“*] ...所以我必须在正则表达式 – user3131164

+0

的某个地方编写”params“不,你不需要。这个正则表达式匹配'... tracks /'中的所有内容,并将它和引号之间的所有内容作为'audio_id'进行分组。然后在引号之后标记任何不是方括号(''')的)被匹配并抛出,包括'params'和其他任何可能遵循'url'属性的东西。当然,我没有测试过这个'preg_replace',但是你应该读入正则表达式来理解我在这里做什么。 – sjagr

0

正则表达式

好了,你可以用下面的方式至极提取audio_id,然后替换整个输入与<audio type="soundcloud">\1</audio>其中\1是提取的audio_id

/.*?tracks\/([^"]+).*/ 

Working DEMO

说明:

.*?      any character except \n (0 or more times 
          (matching the least amount possible)) 
-------------------------------------------------------------------------------- 
    tracks     'tracks' 
-------------------------------------------------------------------------------- 
    \/      '/' 
-------------------------------------------------------------------------------- 
    (      group and capture to \1: 
-------------------------------------------------------------------------------- 
    [^"]+     any character except: '"' (1 or more 
          times (matching the most amount 
          possible)) 
-------------------------------------------------------------------------------- 
)      end of \1 
-------------------------------------------------------------------------------- 
    .*      any character except \n (0 or more times 
          (matching the most amount possible)) 

PHP代码

<? 
    $input = '[soundcloud url="https://api.soundcloud.com/tracks/audio_id" params="*]'; 

    $pattern = '/.*?tracks\/([^"]+).*/'; 

    $replacement= '<audio type="soundcloud">\1</audio>'; 

    $ouptput = preg_replace($pattern, $replacement, $input); 

    echo htmlentities($ouptput); 
?> 

Live DEMO

HTML解析

作为最后一个字,我不知道这是你使用正则表达式解析HTML代码的唯一案例,但请考虑使用一个更合适的工具,那......还有许多HTML解析器都在外面(其中最好的一个是PHP Simple HTML DOM Parser)...

如果您仍然在问为什么,请检查HERE