Düzenli ifadeler / ayrıştırma çift tırnak metin ayıklamak / çıkış kazmak

4 Cevap php

Ben düzenli ifadeleri bulmaktan yardıma ihtiyacım var. Ben kazmak komutunu çalıştırıyorum ve ben onun çıkışını kullanmanız gerekir. Ben bunu ayrıştırmak ve düzgün php kullanarak bir dizi olarak düzenlenmiş almak gerekir.

çıkışlar bu gibi bir şey kazmak:

m0.ttw.mydomain.tel.    60      IN      TXT     ".tkw" "1" "20090624-183342" "Some text here1"
m0.ttw.mydomain.tel.    60      IN      TXT     ".tkw" "1" "20090624-183341" "Some text here2"

Bunu almak istiyorum:

Array
(
    [0] => Array
        (
            [0] => .tkw
            [1] => 1
            [2] => 20090624-183342
            [3] => Some text here1
        )
    [1] => Array
...
)

Ben sadece çift tırnak içine içeriğini gerekir. I can hattı ile kazı çıkış hattı ayrıştırmak, ama ben sadece bunu tüm eşleşen regex desen çalıştırırsanız daha hızlı olacağını düşünüyorum ...

Düşünceler?

4 Cevap

Bu bir tek çizgi ile yakın alır

preg_match_all( '/"([^"]+)"\s*"([^"]+)"\s*"([^"]+)"\s*"([^"]+)"/', $text, $matches, PREG_SET_ORDER );

print_r( $matches );

Ancak, preg_match * fonksiyonlarının nasıl çalıştığını becuase, tam maç her maç grubun dizin 0 dahildir. Eğer gerçekten istiyorsa bu düzeltmek.

array_walk( $matches, create_function( '&$array', 'array_shift( $array );return $array;' ) );

Ben PHP düzenli ifadeler hakkında emin değilim, ama Perl RE basit olacaktır:

my $c = 0;
print <<EOF;
Array
(
EOF
foreach (<STDIN>) {
    if (/[^"]*"([^"]*)"\s+"([^"]*)"\s+"([^"]*)"\s+"([^"]*)"/) {
        print <<EOF;
    [$c] => Array
        (
            [0] = $1
            [1] = $2
            [2] = $3
            [3] = $4
        )
EOF
        $c++;
    }
}

print <<EOF;
)
EOF

Bu, yani, bazı sınırlamaları vardır:

  • Tırnak metin kaçtı tırnak (örneğin \") olabilir eğer bu işe yaramazsa
  • Bu zor sadece dört tırnaklı değerlerini desteklemek için kodlanmıştır.

Kod:

<?php
    $str = 'm0.ttw.mydomain.tel.    60      IN      TXT     ".tkw" "1" "20090624-183342" "Some text here1"
m0.ttw.mydomain.tel.    60      IN      TXT     ".tkw" "1" "20090624-183341" "Some text here2"';

    header('Content-Type: text/plain');
    $matches = array();
    preg_match_all('/(".*").*(".*").*(".*").*(".*")/U', $str, $matches, PREG_SET_ORDER);
    print_r($matches);
?>

Çıktı:

Array
(
    [0] => Array
        (
            [0] => ".tkw" "1" "20090624-183342" "Some text here1"
            [1] => ".tkw"
            [2] => "1"
            [3] => "20090624-183342"
            [4] => "Some text here1"
        )

    [1] => Array
        (
            [0] => ".tkw" "1" "20090624-183341" "Some text here2"
            [1] => ".tkw"
            [2] => "1"
            [3] => "20090624-183341"
            [4] => "Some text here2"
        )

)

Tamamen sizin için sorduk, ama çalışır, tırnak herhangi bir sayı ile dizeleri için kullanılan olabilir, ve (yol daha kod pahasına) ortalama normal ifadenin daha okunabilir olmanın yararı vardır değil ne

class GetQuotedText {	
	const STATE_OUTSIDE = 'STATE_OUTSIDE';
	const STATE_INSIDE 	= 'STATE_INSIDE';

	static private $input;
	static private $counter;
	static private $state;
	static private $results;

	static private $current;
	static private $full;
	static private $all;

	static private function setInput($string) {
		$this->input = $string;

	}

	static private function init($string) {
		self::$current 	= array();
		self::$full 		= array();		
		self::$input 	= $string;
		self::$state 	= self::STATE_OUTSIDE;
	}


	static public function getStrings($string) {
		self::init($string);
		for(self::$counter=0;self::$counter<strlen(self::$input);self::$counter++){
			self::parse(self::$input[self::$counter]);
		}
		self::saveLine();
		return self::$all;
	}

	static private function parse($char) {
		switch($char){
			case '"':
				self::encounteredToken($char);
				break;		
			case "\n":	//deliberate fall through for "\n" and "\r"
			case "\r":
				self::encounteredToken($char);
				break;
			default:
				if(self::$state == self::STATE_INSIDE) {
					self::action($char);
				}
		}
	}

	static private function encounteredToken($token) {
		switch($token) {
			case '"':
				self::swapState();
				break;
			case "\n":	//deliberate fall through for "\n" and "\r"
			case "\r":
				self::saveArray();
				self::saveLine();
				break;
		}
		return;
	}

	static private function swapState() {
		if(self::$state == self::STATE_OUTSIDE) {
			self::$state = self::STATE_INSIDE;
		}
		else {
			self::$state = self::STATE_OUTSIDE;				
			self::saveArray();
		}				
	}
	static public function saveLine() {
		self::$all[] = self::$full;
		self::$full = array();
		//reset state when line ends
		self::$state = self::STATE_OUTSIDE;
	}

	static private function saveArray() {
		if(count(self::$current) > 0) {
			self::$full[] 	= implode ('',self::$current);
			self::$current 	= array();
		}
	}

	static private function action($char) {
		self::$current[] = $char;
	}
}

$input = 'm0.ttw.mydomain.tel.    60      IN      TXT     ".tkw" "1" "20090624-183342" "Some text here1"' . "\n" .
		 'm0.ttw.mydomain.tel.    60      IN      TXT     ".tkw" "1" "20090624-183341" "Some text here2"';
$strings = GetQuotedText::getStrings($input);
print_r($strings);