не удается разделить строку, проанализированную с веб-страницы?

Здесь я анализирую веб-страницу и получаю поле «имя» с этой веб-страницы. Вот код, который выполняет синтаксический анализ:

foreach($dom->getElementsByTagName('table') as $table) {
    if($table->getAttribute('class')=='dataTable'){
        foreach($table->getElementsByTagName('tr') as $tr){
            if(isset($tr->getElementsByTagName('td')->item(0)->nodeValue)){
                $out[$i]['name'] = $tr->getElementsByTagName('td')->item(0)->nodeValue;
            }
        }
    }
}

На веб-странице, которую я анализирую, у меня есть значение узла для name в форме «Mark Smith». Поэтому, когда я получаю результат, у меня есть значение «имя» как «Марк Смит» в IDE и «Марк Смит» в командной строке.

Теперь я хочу разделить строку «имя» таким образом, чтобы получить имя («Марк») и фамилию («кузнец») отдельно.

Я пытался:

explode(" ", $out[$i]['name']) as well as
explode(" " , $out[$i]['name'])

Но мне кажется, что ничего не работает. Помогите мне разделить строку на имя и фамилию?

Надеюсь, я ясно выразился в своем вопросе.


person user1518659    schedule 25.08.2012    source источник
comment
У вас какое-то странное соглашение о закрывающих фигурных скобках.   -  person PeeHaa    schedule 25.08.2012
comment
я намеренно поставил закрывающие скобки, потому что код не завершен полностью .. у меня выполняются некоторые другие операции, которые не относятся к этой теме .. поэтому пропустил это .. @PeeHaa   -  person user1518659    schedule 25.08.2012


Ответы (4)


@user1518659 user1518659 попробуйте это, чтобы решить проблему, просто замените   пробелом перед переходом к DOMDocument, я также добавил разделение имени и фамилии :) надеюсь, это поможет.

<?php 
header('Content-Type: text/html; charset=utf-8'); //Required if your outputting, as the description contains utf-8 characters
//Load the source (input)
$html_source = file_get_contents('http://www.reuters.com/finance/stocks/companyOfficers?symbol=AOS');
$html_source = str_replace('&nbsp;',' ',$html_source);

//Dom document
$dom = new DOMDocument('1.0');
@$dom->loadHTML($html_source);

$out =array();
$i=0;
foreach($dom->getElementsByTagName('table') as $table) {
    if($table->getAttribute('class')=='dataTable'){

        foreach($table->getElementsByTagName('tr') as $tr){
            if(isset($tr->getElementsByTagName('td')->item(0)->nodeValue)){

                $out[$i]['fullname'] = $tr->getElementsByTagName('td')->item(0)->nodeValue;

                $name = explode(' ',$out[$i]['fullname']);
                $out[$i]['first_name'] = $name[0];
                $out[$i]['last_name'] = $name[1];

                if(!isset($tr->getElementsByTagName('td')->item(2)->nodeValue)){

                    foreach ($out as $key=>$value){
                        if($value['fullname'] == $tr->getElementsByTagName('td')->item(0)->nodeValue &&
                        !is_numeric(substr($tr->getElementsByTagName('td')->item(1)->nodeValue,0,1)) && 
                        $tr->getElementsByTagName('td')->item(1)->nodeValue != "--" ){
                            $out[$key]['description']= $tr->getElementsByTagName('td')->item(1)->nodeValue;
                        }
                    }

                }else{
                    if(!isset($tr->getElementsByTagName('td')->item(2)->nodeValue)){continue;}
                    if(isset($tr->getElementsByTagName('td')->item(3)->nodeValue)){
                        $out[$i]['age']= $tr->getElementsByTagName('td')->item(1)->nodeValue;
                        $out[$i]['since']= $tr->getElementsByTagName('td')->item(2)->nodeValue;
                        $out[$i]['position']= $tr->getElementsByTagName('td')->item(3)->nodeValue;
                    }
                }
                $i++;
            }
        }
    }
}

//Clean up
$return = array();
foreach ($out as $key=>$row){
    if(isset($row['fullname']) && isset($row['age']) && isset($row['since']) && isset($row['position']) && isset($row['description'])){
        $return[$key] = $out[$key];
    }
}


print_r($return);

/*
Array
(
    [0] => Array
        (
            [fullname] => Paul Jones
            [first_name] => Paul
            [last_name] => Jones
            [age] => 63
            [since] => 2011
            [position] => Chairman of the Board, Chief Executive Officer
            [description] => Mr. Paul W. Jones serves as the Chairman of the Board, Chief Executive Officer of A. O. Smith Corp. He has been a director of company since 2004. He is a member of the Investment Policy Committee of the Board. He was elected chairman of the board, president and chief executive officer effective December 31, 2005. He was president and chief operating officer from 2004 to 2005. Prior to joining the company, he was chairman and chief executive officer of U.S. Can Company, Inc. from 1998 to 2002. He previously was president and chief executive officer of Greenfield Industries, Inc. from 1993 to 1998 and president from 1989 to 1992. Mr. Jones has been a director of Federal Signal Corporation since 1998, where he chairs the Nominating and Governance Committee and is a member of the Compensation and Benefits Committee and the Executive Committee, and Integrys Energy Group, Inc. since 2011, where he is a member of the Compensation and Financial Committees. He was also a director of Bucyrus International, Inc. from 2006 until its acquisition by Caterpillar, Inc. in 2011, and chaired the Compensation Committee.
        )

    [1] => Array
        (
            [fullname] => Ajita Rajendra
            [first_name] => Ajita
            [last_name] => Rajendra
            [age] => 60
            [since] => 2011
            [position] => President, Chief Operating Officer, Director
            [description] => Mr. Ajita G. Rajendra serves as the President, Chief Operating Officer and Director of A. O. Smith Corp. He was elected a director of company in December 2011, based on the recommendation of the Nominating and Governance Committee, following his election as President and Chief Operating Officer in September 2011. Mr. Rajendra joined the company as President of A. O. Smith Water Products Company in 2005, and was named Executive Vice President of the company in 2006. Prior to joining the company, Mr. Rajendra was Senior Vice President at Kennametal, Inc., a manufacturer of cutting tools, from 1998 to 2004. Mr. Rajendra also serves on the board of Donaldson Company, Inc., where he is a member of the Audit Committee and Human Resources Committee. Further, Mr. Rajendra was a director of Industrial Distribution Group, Inc. from 2007 until its acquisition by Eiger Holdco, LLC in 2008.
        )
        ...
        ...
*/
?>
person Lawrence Cherone    schedule 25.08.2012
comment
СПАСИБО @Lawrece Cherone .. это сработало как шарм .. +1 - person user1518659; 25.08.2012
comment
Na извините без обид :), вы всегда можете задать свои вопросы здесь @ SO. - person Lawrence Cherone; 25.08.2012
comment
Теперь я пытаюсь вставить данные, полученные из массива результатов, в базу данных mysql. Мне интересно, можно ли вставить примерно 1000 строк за раз с помощью запроса, кроме добавления каждого значения в конец строки длиной в милю, а затем выполнить его. - person user1518659; 25.08.2012
comment
Если вы используете PDO, вы можете легко создать модель для обработки ввода вашей базы данных, вам нужно открыть новый вопрос с кодом, который у вас есть. - person Lawrence Cherone; 25.08.2012
comment
Также в массиве результатов в поле описания несколько деталей находятся в недопустимом формате. Например, например. исходное описание содержит ("Bemis") на веб-странице, но в результате анализа оно отображается как (├ó┬Ç┬£Bemis├ó┬Ç┬¥). проверьте источник страницы URL. в чем может быть причина..как решить.? Я также пробовал $html_source = str_replace('“','',$html_source); $html_source = str_replace('”','',$html_source); но не смог разобраться. - person user1518659; 26.08.2012
comment
@user1518659 user1518659 вам следует использовать header('Content-Type: text/html; charset=utf-8');, если вы собираетесь выводить результат в браузер, а также, если вы собираетесь хранить результат в базе данных, кодировка также должна быть utf-8, поскольку в описании есть символы utf-8. Я ранее добавил заголовок к редактированию, возможно, вы его пропустили. - person Lawrence Cherone; 26.08.2012
comment
да.. я это заметил, а также попробовал, но это не похоже на кодировку utf-8.. и результат все тот же.. никаких изменений.. все еще получаю (├ó┬Ç┬£Bemis├ó┬Ç ┬¥). попробуйте поискать «Bemis» в источнике страницы и найдите («Bemis») и скажите мне, какую кодировку использовать.. я плохо об этом знаю.. - person user1518659; 26.08.2012

Попробуйте решить проблему  :

explode(chr(0xC2).chr(0xA0), $str)

Неразрывный пробел существует в UTF-8 из двух байтов: 0xC2 и 0xA0.

Ссылка - Проблема синтаксического анализа PHP - и

person Sean    schedule 01.07.2015
comment
Пожалуйста, подумайте о том, чтобы добавить хотя бы несколько слов, объясняющих ОП, и чтобы дальнейшие читатели ответили, почему и как он отвечает на исходный вопрос. - person β.εηοιτ.βε; 02.07.2015

Сущность неразрывного пробела, которая у вас есть, сломана. Должно быть &nbsp;. Обратите внимание на точку с запятой.

Чтобы ответить на ваш вопрос, вы можете просто сделать:

var_dump(explode('&nbsp', $out[$i]['name']));

Или, если сущность фиксирована:

var_dump(explode('&nbsp;', $out[$i]['name']));
person PeeHaa    schedule 25.08.2012
comment
до сих пор не могу его получить .. теперь я пытаюсь $out[$i]['name'] = $tr->getElementsByTagName('td')->item(0)->nodeValue; $chars = взорвать(' ', $out[$i]['name']); $out[$i]['f_name'] = $chars[0]; $out[$i]['l_name'] = $chars[1]; и результат, который я получаю: [имя] => Джин Вульф [f_name] => Джин Вульф [l_name] => Он не расщепляется. - person user1518659; 25.08.2012
comment
У меня работает. Таким образом, либо имя, которое вы указали в качестве примера в своем коде, не является реальной строкой, либо в вашем коде что-то еще не так. - person PeeHaa; 25.08.2012
comment
@user1518659 user1518659: подумай над моим ответом. - person khaverim; 25.08.2012

Это должно сделать это

<?php

$a = preg_split( "/[\s]|[&nbsp;]|[ ]/", $out[$i]['name'] ); //$a is an array with keys: Mark, Smith

explode() позволяет только один разделитель разделить строку/массив, в то время как preg_split() используется для множества разделителей

person khaverim    schedule 25.08.2012
comment
Это почти идеально, но php не распознает «┬». когда я попытался включить «┬», он просто включает [-á] вместо [┬á]. как это решить? - person user1518659; 25.08.2012
comment
«Марк┬Смит» разделяется на «Марк┬» и «Смит», а «Джин┬Вульф» делится на «Ге» и «е┬», а также «Матиас┬Сандовал» на «Матиа» и «┬» .. не ожидаемый результат, как вы понимаете.. где мы пропали? - person user1518659; 25.08.2012