2015-11-28 38 views
1

我已經在此工作了一段時間沒有成功。所以我在尋求幫助。php preg_replace 100%變成100;%

我有什麼:

我有各種圖案的數組我找的,所以我可以代替他們。數組中的所有其他項目都可以正常工作。這些替換字符串中只有一個是我以前從未見過的。

該字符串是:

width_(\d+\w+)=width: $1; 

當這是通過破開的等號爆炸:

$a = explode('=', $replacement_string); 

這變爲:

$a[0] = "width(\d+\w+)"; 

$a[1] = "width: $1;"; 

然後對輸入的字符串進行測試。

$a = preg_replace("/$a[0]/i", "$a[1]", $incoming_string); 

現在「我不知道它爲什麼這樣做」部分。如果輸入的字符串是

"width_100px" 

我回來

"width: 100px;" 

但如果輸入字符串是

"width_100%" 

我回來

"width: 100;%" 

奇怪的是 - 如果我剛回來

"width: 100;" 

我能理解它。 「%」與分號(;)匹配。但是這將分號放在AND百分號中。只是它們被顛倒了。我甚至試圖尋找,看看是否有一個百分號和其更改爲

"width_100\%" 

但是,這並沒有改變它所散發出來的。

我也只是嘗試了「%%」而不是一個「%」。仍然作爲

width: 100;% 

任何幫助表示讚賞。

回答說:

這個問題的答案難題是正則表達式的 「\ W」 部分確實匹配百分號(%),因爲\ w是唯一的[A-ZA-Z0-因爲所有這些字符串都被分解到不同的請求中,所以width_100%是通過改變它正在查找的內容來完成的(\ d +(。*))(根據Chris85的建議) - 這會捕獲數字(在本例中爲100)以及百分號,從而允許我將其轉換爲「寬度:100%」。

非常感謝Chris和Uby的幫助。

+0

是的,我忘了把它們。他們在原始代碼中。 $ d = preg_replace(「/ $ c [0]/i」,「$ c [1]」,$ v1); 我修改了上述問題。 –

+0

好吧,你有沒有找到'%'的正則表達式,所以它不會取代它。如果它們最後出現,你想替換'%'嗎? – chris85

+0

不,我正在做的是將CSS信息從使用下劃線轉換爲實際的CSS命令。所以像border_1px_solid_white變成邊框:1px純白色。在這種情況下,我將width_100%轉換爲寬度:100%。所以基本上,我正在生成我的CSS而不是具有單獨的CSS文件。爲什麼?因爲那樣我就不必在兩個地方進行更改。我只需修改HTML中的CSS命令,它們就是我自動生成的。 –

回答

1

您可以在這裏看到您的當前問題更換(\d+\w+)https://regex101.com/r/xD9rG3/1

%不匹配,因此在離開你可以告訴正則表達式來尋找%px用。這個表達。

width_(\d+(?:px|%)) 

功能演示:

$replacement_string = 'width_(\d+(?:px|%|em))=width: $1;'; 
$a = explode('=', $replacement_string); 
//$a[0] = "width(\d+\w+)"; 
//$a[1] = "width: $1;"; 
$incoming_string = 'width_100%'; 
$a = preg_replace("/$a[0]/", "$a[1]", $incoming_string); 
echo $a; 

正則表達式101演示:https://regex101.com/r/xD9rG3/2

你也應該注意到,\w包含下劃線所以你的另一regexs可能會失敗。如果您只想查找字母字符,請使用[a-zA-Z]+或者如果要包含數字,請添加\d

另一個正則表達式,你可以使用,我不會建議是:

width_(\d+.*) 

這是說找到width_數字的任意金額,然後所有其他字符。這可能會爲您生成無效的CSS。這將匹配你的whatever the part is after the number請求雖然..

+0

工作! :-)但我真的需要它是通用的,所以我不必用所有不同的方式來表達數字的表達方式。但是,多虧了你,我得到了它的工作! :-)我用寬度_(\ d +(。*))。這個數字之後就抓住了一切。但是如果我沒有看到你做了什麼,我就不會想到它。謝謝!!!!! :-) –

+0

沒問題。樂意效勞。 '。*'可以用於很多事情,但也可能是一個巨大的錯誤;小心一點。如果它解決了您的問題,請務必接受此答案。 http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – chris85

+0

由於所有這些CSS事情都被破壞了 - 使用(。*)應該沒有問題。我編寫了一個PHP腳本,它接受一個可視頁面HTML文件(VP是一個非常古老的HTML編輯器,但我習慣了它),它刪除了諸如

命令之類的東西,並用上面的命令中的CSS命令替換它在哪裏找到它(通常如同TD或BODY命令一樣)。然後它將它們轉換爲標準的CSS。所以像css =「center width_100%height_20px」可能是一條線。我還將分隔符放入CSS文件中,以便我可以添加命令(如果需要)並且它們不會被刪除。 –

1

您的正則表達式爲:\d+\w+,不包含char %的百分比。因此,替換將簡單地忽略它,並用width: 100;替換width_100

嘗試(\d+[a-zA-Z0-9_%]+)

+0

是的!這個答案和Chris85的回答讓我知道了我需要的東西。我改變了a-z的東西只是「。*」,它的工作。所以寬度_(\ d +(。*))的作品。但是我.....哦....百分號不是\ w的一部分。現在我已經知道了。 :-) 謝謝! –

+0

使用'。*'時要小心,只有當你的原始字符串只包含你的「命令」(就像你定義的那樣)並且沒有其他任何東西時,它纔會起作用。在這種情況下,你可以擺脫'\ d +',因爲'width _(。*)'可以正常工作。 – Uby

+0

我試圖檢查你的答覆和Chris85的答覆是否正確,但它只允許我這樣做。所以我嘗試點擊向上的箭頭。它讓我這樣做。希望可以幫助您評分。 :-) –