Чтение php файлов со специальными тегами в php - PullRequest
0 голосов
/ 27 апреля 2011

У меня есть файл, который выглядит следующим образом

<<row>> 1|test|20110404<</row>>
<<row>> 1|test|20110404<</row>>

<<row>><</row>> указывает начало и конец строки. Я хочу прочитать строку между этими тегами, а также проверить, присутствуют ли эти теги.

Ответы [ 3 ]

0 голосов
/ 27 апреля 2011

Создание собственного формата не так сложно, но создание сценария для чтения может быть затруднено.Преимущество использования стандартизированных форматов заключается в том, что большинство языков программирования уже поддерживают их.Например:

XML: вы можете использовать функцию simplexml_load_string() и с ее помощью можно легко перемещаться по содержимому.

$str = "<?xml version="1.0" encoding="utf-8"?>
<data>
   <row>1|test|20110404</row>
   <row>1|test|20110404</row>
</data>";
$xml = simplexml_load_string($str);

Теперь вы можете получить доступ к своим данным

echo $xml->row[0];
echo $xml->row[1];

Я уверен, что вы поняли идею, также есть очень хорошая поддержка JSON (Javascript Object Notation) с использованием функции jsondecode();Проверьте это на php.net для более подробной информации

0 голосов
/ 27 апреля 2011

я бы предложил использовать preg_match: -

 preg_match( '#<< row>>(.*)<< /row>>#', $line, $matches);

 if( ! empty($matches))
 {
  // line was found
  print_r( $matches[1] ); // will contain the content between the start and end row tags
 }
0 голосов
/ 27 апреля 2011

Первое, что вам нужно сделать, это найти позицию этого «тега».Функция strpos() делает именно это.

$tag_pos=strpos('<> 1|test|20110404<> <> 1|test|20110404<>', '<>');
if ($tag_pos===false) {
    //The tag was not found!
} else {
    //$tag_pos equals the numeric position of the first character of your tag
}

Если это действительно линии, эффективный способ получить их все - просто разделить на <>.

$lines=explode('<>', '<> 1|test|20110404<> <> 1|test|20110404<>');
$lines=array_filter($lines); //Removes blank strings from array

Вы можете улучшить это, добавив функцию обратного вызова к вызову array_filter(), который использует trim() для удаления любых пробелов, а затем посмотрите, если этопусто или нет.


Редактировать: Отлично, я вижу, что ваши "теги" отсутствовали в вашем сообщении.Поскольку ваши начальные и конечные теги не совпадают, приведенный выше код будет вам мало полезен.Позвольте мне попробовать еще раз ...

function strbetweenstrs($source, $tag1, $tag2, $casesensitive=true) {
    $whatsleft=$source;
    while ($whatsleft<>'') {
        if ($casesensitive) {
            $pos1=strpos($whatsleft, $str1);
            $pos2=strpos($whatsleft, $str2, $pos1+strlen($str1));
        } else {
            $pos1=strpos(strtoupper($whatsleft), strtoupper($str1));
            $pos2=strpos(strtoupper($whatsleft), strtoupper($str2), $pos1+strlen($str1));
        }
        if (($pos1===false) || ($pos2===false)) {
            break;
        }
        array_push($results, substr($whatsleft, $pos1+strlen($str1), $pos2-($pos1_strlen($str1))));
        $whatsleft=substr($whatsleft, $pos2+strlen($str2));
    }
}

Обратите внимание, что я не проверял это ... но вы получите общее представление.Вероятно, есть гораздо более эффективный способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...