2017-10-19 81 views
1

所有顯示的文本這是我在StackOverflow上的第一篇文章,我希望我會盡我所能,尊重所有的規則:)摘自PHP代碼

我有一個包含PHP代碼的文件。我正在嘗試讀取文件並僅提取通過回顯行顯示的文本,而沒有動態內容。

這裏是一個PHP代碼示例,我使用用於測試目的:

some HTML data 
<?php 
    echo 'OK'; 
    echo 'OK'.$ko; 
    echo $ko.'OK'; 
    echo $ko.'OK'.$ko.'OK'.$ko; 
    echo 'OK'.$ko.'OK'.$ko; 
    echo 'OK'.(($data=='toto') ? 'OK' : 'OK2').'OK'; 
    echo someFunction().'OK'; 
?> 
some HTML data 

我沒有問題通過以下正則表達式中提取從內容的其餘部分的PHP代碼:

preg_match_all("~<\\?php(.*?)\\?>~siu", $initialContent, $tMatches, PREG_SET_ORDER); 

但我沒有成功找到如何從回顯行中刪除PHP代碼,並只保留靜態內容。 我想要檢測的是:

1「echo」;不開始

2不限內容的內容與報價,與相等數目的開閉括號(如果有的話),以及由點精加工; - 或者 - 引號之間的任何內容(檢測到轉義字符)

在步驟2上循環4次,直到達到「;」。

我該走向正確的方向嗎?你能幫我關於我應該用於第2步的正則表達式嗎?

在此先感謝!

[更新]

我成功了使用下面的正則表達式(我知道,它不包括回波函數的每一個可能的用法,但我認爲這是夠了)來匹配回聲內容:

preg_match_all("~echo ([^'\"]*?((?<!\\\\)['\"])((?:(?!\\2).)+?|(?-3))*?\\2[^'\"]*?);~siu", $initialContent, $tMatches, PREG_SET_ORDER); 

既然我有內容,我必須刪除任何PHP代碼才能保留靜態內容。我打算使用的preg_replace刪除該內容,但我沒有發現任何的正則表達式來實現這一目標?

+1

你可以遇到這麼多的邊緣情況下這樣做,我不會推薦使用正則表達式,而是http://php.net/token_get_all – Calimero

+1

實際上有很多邊緣情況,如回聲可以與括號'echo('foo');'等等。我們可以知道這個目標是什麼嗎?這可能是一個XY問題 – Kaddath

+0

總的想法是,我想向翻譯者發送我的頁面的所有內容。 對於靜態HTML內容沒有問題,我刪除了HTML標籤,我能夠(從輸入字段)返回佔位符,我沒有問題,與具有使用DB ... 翻譯的錯誤信息等但有時,我認爲有一些PHP基本內容(如一個循環來顯示一個陣列的不同線)和它可以發生在直接從PHP代碼顯示文本。 當然,我可以修改我的所有視圖,以避免但這需要大量的時間,而正則表達式會更容易:d – Lionel

回答

0

當你有問題,面對和你打算使用解決正則表達式吧,現在你有2個問題:)

/['"]([^'"]*)['"]/ 

希望正則表達式可以幫助您提取數據。

+0

哈哈是的,這是真的。正則表達式真的很痛苦寫... :( 感謝您的回覆,但我正在尋找更詳盡的東西。例如,如果您已經轉義引號,或者如果您的字符串由單引用並在裏面加雙引號 關於這部分正則表達式,我目前使用: ((?<!\\)['「])((?:(?!\ 2)。)+?|(? -3))*?\ 2 – Lionel