簡體   English   中英

preg_match()+正則表達式在TXT文件中不起作用

[英]preg_match() + regex does not work in TXT file

范例1:

我有一個PDF文檔,並在線使用了PDF Parser(www.pdfparser.org)來獲取其所有文本格式的內容。 (手動)搶救TXT文件中的內容,並嘗試使用正則表達式過濾某些數據,一切正常。


范例2:

為了自動化該過程,我下載了PDF Parser API,並制作了一個遵循以下規則的腳本:

1)使用ParseFile()API方法轉換PDF文本。
2)保存TXT的內容。
3)嘗試使用正則表達式過濾掉此TXT。


示例1->它起作用並返回我:

array (size = 2)
   'mora_dia' =>
     array (size = 1)
       0 => string 'R $ 3.44' (length = 7)
   'fine' =>
     array (size = 1)
       0 => string 'R $ 17.21' (length = 8)

示例2->它不起作用。

array (size = 2)
   'mora_dia' =>
     array (size = 0)
       empty
   'fine' =>
     array (size = 0)
       empty
  • 來自兩個TXT的數據相等,但是因為在第二個示例中不起作用? *(我嘗試在不保存TXT的情況下執行此操作,但是沒有用)

以下是我的兩個示例的代碼:

范例1:

$data = file_get_contents('exemplo_01.txt');

$regex = [
    'mora_dia' => '/R\$ [0-9]{1,}\.[0-9]{1,}/i',
    'multa'    => '/R\$ [0-9]{1,}\,[0-9]{1,}/i'
];

foreach($regex as $title => $ex)
{
    preg_match($ex, $data, $matches[$title]);
}

var_dump($matches);

范例2:

$parser = new \Smalot\PdfParser\Parser();
    $pdf = $parser->parseFile($PDFFile);
    $pages = $pdf->getPages();

    foreach ($pages as $page) {
        $PDFParse = $page->getText();
    }

    $txtName = __DIR__ . '/files/Txt/' . md5(uniqid(rand(), true)) . '.txt';
    $file  = fopen($txtName, 'w+');
    fwrite($file, $PDFParse);
    fclose($file);

    $dataTxt = file_get_contents($txtName);

    $regex = [
        'mora_dia' => '/R\$ [0-9]{1,}\.[0-9]{1,}/i',
        'multa'    => '/R\$ [0-9]{1,}\,[0-9]{1,}/i'
    ];

    foreach($regex as $title => $ex)
    {
        preg_match($ex, $dataTxt, $matches[$title]);
    }
 $PDFParse ='';
 foreach ($pages as $page) {
     $PDFParse = $PDFParse.$page->getText();
 }

如果PDFParse是字符串,並且在fwrite之后嘗試fflush($ file)

您手動復制和粘貼輸出文本的操作似乎實際上已更改了其內容。 根據pastebin輸出,直接到文件版本包含不間斷的空格字符,而不是常規空格。 不間斷空格的十六進制代碼為0xA0 ,ASCII為160,與常規空格十六進制的0x20 ASCII為32。

實際上,直接文件示例中的所有空格字符似乎都是不間斷的0xA0空格。

為了使您的正則表達式能夠容納任何一種類型的空間,您可以將十六進制代碼與[ \\xA0]的常規空格字符' '一起放置在[]字符類中,以匹配這兩種類型。 此外,您將需要/u標志才能使用unicode。

$regex = [
    'mora_dia' => '/R\$[ \xA0][0-9]{1,}\.[0-9]{1,}/iu',
    'multa'    => '/R\$[ \xA0][0-9]{1,},[0-9]{1,}/iu'
];

(注意,在,逗號不需要反斜杠逃逸)

使用原始的pastebin作為輸入,這可以正常工作:

$str = file_get_contents('http://pastebin.com/raw.php?i=H7D5xJBH');
preg_match('/R\$[ \xa0][0-9]{1,}\.[0-9]{1,}/ui', $str, $matches);
var_dump($matches);

// Prints:
array(1) {
  [0] =>
  string(8) "R$ 3.44"
}

一個不同的解決方案可能是在應用原始正則表達式之前,用整個文本中的正則空格替換不間斷空格:

// Replace all non-breaking spaces with regular spaces in the
// text string read from the file...
// The unicode non-breaking space is represented by 00A0
// and both are needed to replace this successfully.
$dataTxt = str_replace("\x00\xA0", " ", $dataTxt);

無論何時輸入,您都希望它們是相同的,在視覺上看起來是相同的,請務必使用能夠顯示每個字符十六進制代碼的工具來檢查它。 在這種情況下,我將您的樣本從pastebin復制到文件中,並使用Vim對其進行了檢查,在其中為光標下方的字符設置了十六進制和ASCII顯示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM