Bir düz metin form mektubu değişkenleri ayıklamak için regex kullanarak?

3 Cevap php

Ben PHP Düzenli ifadeler kullanarak iyi bir örnek için arıyorum, bir çok satırlı metin yapıştırılan ve işlem için bir komut dosyası için gönderildi (tabii bilinen biçimi ile,) "tersine mühendislik" mektup formu için.

Yani, örneğin, en this is the original plain-text input (USDA basın bülteninden alınmıştır) varsayalım:

WASHINGTON, April 5, 2010 - North American Bison Co-Op, a New Rockford, N.D., establishment is recalling approximately 25,000 pounds of whole beef heads containing tongues that may not have had the tonsils completely removed, which is not compliant with regulations that require the removal of tonsils from cattle of all ages, the U.S. Department of Agriculture's Food Safety and Inspection Service (FSIS) announced today.

Anlaşılır olması için, değişkenler alanları aşağıda belirtilmiştir:

[pr_city=]WASHINGTON, [pr_date=]April 5, 2010 - [corp_name=]North American Bison Co-Op, a [corp_city=]New Rockford, [corp_state=]N.D., establishment is recalling approximately [miktar=]25,000 pounds of [ürün=]whole beef heads containing tongues that may not have had the tonsils completely removed, which is not compliant with regulations that require [neden=]the removal of tonsils from cattle of all ages, the U.S. Department of Agriculture's Food Safety and Inspection Service (FSIS) announced today.

Nasıl verimli içeriğini ayıklamak

  • pr_city
  • pr_date
  • corp_name
  • corp_city
  • corp_state
  • miktar
  • ürün
  • neden

Benim örnek alanlar?

Herhangi bir yardım, teşekkürler duyacağız.

3 Cevap

Peki, örneğin üzerinde çalışan bir regex (okunaklı bu canavarı tutmak tanıtıldı satır sonları, kullanımdan önce kaldırılması gerekir) bu gibi görünebilir:

/^(?P<pr_city>[^,]+), (?P<pr_date>[^-]+) - (?P<corp_name>.*?), a 
(?P<corp_city>[^,]+), (?P<corp_state>[^,]+), establishment is 
recalling approximately (?P<amount>.*?) of (?P<product>.*?), 
which is not compliant with regulations that require (?P<reason>.*?), 
the U\.S\. Department of Agriculture\'s Food Safety and Inspection 
Service \(FSIS\) announced today\.$/

Yani, PHP Yapabileceğin

if (preg_match('/^(?P<pr_city>[^,]+), (?P<pr_date>[^-]+) - (?P<corp_name>.*?), a (?P<corp_city>[^,]+), (?P<corp_state>[^,]+), establishment is recalling approximately (?P<amount>.*?) of (?P<product>.*?), which is not compliant with regulations that require (?P<reason>.*?), the U\.S\. Department of Agriculture\'s Food Safety and Inspection Service \(FSIS\) announced today\.$/', $subject, $regs)) {
    $prcity = $regs['pr_city'];
    $prdate = $regs['pr_date'];
    ... etc.
} else {
    $result = "";
}

Bu bir hayır satır sonları vardır örneğin şeylerin çift, ve giriş tüm dize (ve bu kısmı elde edilecek olan hangi büyük bir dize) olduğunu varsayar. Biraz mantıklı hukuki değerler hakkında varsayımlar yapmak için denedim, ama diğer girdiler bu kırılabilir ki çok gerçek bir şans var. Yani biraz daha test durumlarda muhtemelen ihtiyaç vardır.

Çevreleyen metin sabit ise, o zaman bu kısmi regex gibi bir şey hile yapabilir:

preg_match('/^(.*?), (.*?)- (.*?), a (.*?), (.*?), establishment is recalling approximately (.*?), which is not compliant with regulations that require (.*?), the U.S. Department of Agriculture's Food Safety and Inspection Service (FSIS) announced today./', $text, $matches);

$matches[1] = 'WASHINGTON';
$matches[2] = 'April 5, 2010';
$matches[3] = ... etc...

Çevreleyen metin değişiklikleri, sonra vb yanlış maçlar, hiçbir maç, bir ton ile sonuna kadar gidiyoruz .. Esasen / PR bültenleri anlamak ayrıştırmak için bir AI gerekiyordu.

Diğer iki iyi gibi Edit:, bu çılgın cevabı göz ardı edin. Herhalde bunu silmeli, ama başvuru için o kadar tutuyorum.

Ayrıştırmak, sonra işaretlemeleri ekleyerek girişinden bir XML dizesi oluşturmak: Ben sadece işe yarayabilecek çılgın bir fikrim var. Bu (tamamen denenmemiş) kodu gibi görünebilir:

preg_replace('([^,]*), ([^-]*)- ...etc...', '<pr_city>\1</pr_city><pr_date>\2</pr_date> ...etc...');

Sonra XML Ayrıştırma en iyi PHP belgelerine sol bir gereksiz karmaşık bir süreçtir: http://www.php.net/manual/en/function.xml-parse.php.

Ayrıca () ayrıştırmak json_decode sonra kullanarak, bu yöntem ile JSON dönüştürerek düşünebiliriz. Her durumda, " işaretleri ve > sembolleri girişi görünür ne olur düşünmek zorunda.

Bu sadece maç ve bir anda metnin bir parçası kaldırmak için daha kolay olabilir.