2013-12-24 45 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