2016-06-14 108 views
0

我正在循環使用大量的.PHP文件,將它們視爲純文本,並試圖找到某些函數的文本參數。在文本中查找特定參數

PHP文件中的函數全部通過使用\L10n::來調用,然後獲取字符串參數。

我試圖找到的文本示例如下。

我已經運用以下正則表達式正確找到了這個問題。

pattern = re.compile("L10n::[\w]+\((?:\'(.*?)\')\,?\s?(?:\'(.*?)\')*", re.MULTILINE | re.IGNORECASE | re.DOTALL) 

OR

pattern = re.compile("\\L10n::(.*?)\('(.*?)'\)", re.MULTILINE | re.IGNORECASE | re.DOTALL) 


bar\L10n::__('Double _')baz 
bar\L10n::esc_attr__('Escape Attributes __')baz 
bar\L10n::esc_html__('Escapted HTML __')baz 
bar\L10n::_e('Echos')baz 
bar\L10n::esc_html_e('Echo Escaped HTML')baz 
bar\L10n::_x('Underscore X')baz 
bar\L10n::_ex('Echo underscore x')baz 
bar\L10n::esc_attr_x('Escape Attribute X')baz 
bar\L10n::esc_html_x('Escaped HTML X')baz 
bar\L10n::_n('Nothing')baz 
bar\L10n::_nx('No X')baz 
bar\L10n::_n_noop('N No-Op')baz 
bar\L10n::_nx_noop('No X No-Op')baz 

有了這樣說,一些多個參數

bar\L10n::_n('Text 1', 'Text 2', $variable) 

在這種情況下,我想文本1和文本2,而不是$變量。

爲了讓它更有趣...有時參數不是全部在一行上。

bar\L10n::_n(
    'Text 1', 
    'Text 2', 
    $variable 
) 

如果文本有逃脫「裏面,如‘這看起來在人們間沒有\’這裏T」

第二個正則表達式拍打我上面有我上面有了第一個正則表達式模式失敗如果有多個文本變量,則會失敗。 (它也帶來了_n部分,但沒關係)

任何幫助,將不勝感激。

編輯:

我也應該狀態,會出現在文件中的其他功能,我希望忽略。

如:

foo\file::__('function to ignore') 

我不想以配合這些。

我也想匹配L10n函數在其他函數中用作參數的地方。

EG

bar\file::__(bar\L10n::_e('Text 1'), 'Other variable to ignore') 

回答

0

讓我試試我這一個:

import re 
input = """bar\L10n::__('Double _')baz 
bar\L10n::esc_attr__('Escape Attributes __')baz 
bar\L10n::_n(
    'Text 1', 
    'Text 2', 
    $variable 
)""" 
input = input.replace('\n', '') 
reg = re.compile('\'(.*?)\'') 
foo = reg.findall(input) 

給出了一個數組:

['Double _', 'Escape Attributes __', 'Text 1', 'Text 2'] 

現在,如果你想獲得幻想和索引一切在一個散列,以便您可以輕鬆地迭代一切?

import re 
input = """bar\L10n::__('Double _', 'another')baz 
bar\L10n::esc_attr__('Escape Attributes __')baz 
bar\L10n::_n(
    'Text 1', 
    'Text 2', 
    $variable 
)""" 
dict = {} 
input = input.split('bar\\L10n::') 
regName = re.compile('(.*)\(') 
regAttr = re.compile('\'(.*?)\'') 
for i in input: 
    foo = regName.search(i) 
    if foo is not None: 
     dict[foo.group(1)] = regAttr.findall(i) 

將使字典,看起來像:

{'__': ['Double _', 'another'], '_n': ['Text 1', 'Text 2'], 'esc_attr__': ['Escape Attributes __']} 

希望這有助於!

有一個很好的網站叫做Rubular,我用它作爲正則表達式,它應該是用於Ruby,但我用它來做Ruby,Python和Perl正則表達式。我建議檢查一下,如果你認爲你會做更多的正則表達式的東西。

編輯:(註釋中討論後)

import re 

globalDict = {} 

for file in directory: # pseudo-code, implement this loop yourself 

    fileContents = """bar\L10n::__('Double _', 'another')baz 
    bar\L10n::esc_attr__('Escape Attributes __')baz 
    bar\L10n::_n(
     'Text 1', 
     'Text 2', 
     $variable 
    )""" 
    regAttr = re.compile('\'(.*?)\'') 
    for i in regAttr.findall(fileContents): 
     if i in globalDict.keys(): 
      globalDict[i].append('filename') 
     else: 
      globalDict[i] = ['filename'] 
+0

感謝您的。 我想要一本字典,所以這很容易,但我希望它的結構如下: '{'Double _':['filename_1','filename_2'],'Text 1': ['filename_2','filename_3'] ..} (之前我得到這個代碼我循環通過文件,所以我想創建一個文件的列表中找到該短語) 你會怎麼樣改變你的代碼來適應這個? –

+0

使用regAttr正則表達式並將它們用作鍵可能?對不起,我不熟悉.PHP文件。 –

+0

查看我的其他評論。 沒關係......被搜索有點可怕! :( –

相關問題