simplexml_load_file с & (амперсанд) в URL с Solr

Я использую Solr и у меня есть следующий запрос, который отлично работает в моем браузере:

 http://www.someipaddress.com:8983/solr/select?q=*&fq=shopid:40&start=0&rows=18&fq=manufacturer:"Bausch+%26+Lomb"

В части возвращаемого xml я вижу:

<str>manufacturer:"Bausch & Lomb"</str>

Однако, когда я пытаюсь получить указанный выше URL-адрес, используя simplexml_load_file следующим образом:

$xml = simplexml_load_file("http://127.0.0.1:8983/solr/select?q=*&fq=shopid:40&start=0&rows=18&fq=manufacturer:\"Bausch+%26+Lomb\"");

Я не получаю никаких результатов, потому что Solr передается строка производителя, которая выглядит следующим образом (из print_r):

[str] => Array ( [0] => shopid:40 [1] => manufacturer:"Bausch+%26+Lomb" )

Поэтому, когда я делаю запрос через браузер, я передаю% 26, но он правильно обрабатывает его в запросе. Но когда я использую simplexml_load_file, он остается как %26, поэтому запрос не выполняется.


person someuser    schedule 18.10.2011    source источник
comment
Между прочим, если возвращенный вами XML на самом деле имеет значение <str>manufacturer:"Bausch & Lomb"</str>, то это искаженный XML, и вы должны исправить его, прежде чем сможете обработать его с помощью XML-инструментов. Должно быть <str>manufacturer:"Bausch &amp; Lomb"</str>   -  person jasso    schedule 20.10.2011


Ответы (2)


Попробуйте: simplexml_load_file(rawurlencode('http://127.0.0.1:8983/solr/select?q=*&fq=shopid:40&start=0&rows=18&fq=manufacturer:"Bausch' .urlencode('&'). 'Lomb"'))

См. примечание к параметру file: http://php.net/manual/en/function.simplexml-load-file.php

person hkn    schedule 18.10.2011
comment
Спасибо большое. Ты чемпион! Я разместил полный ответ в разделе ответов. - person someuser; 18.10.2011
comment
Поскольку новый пользователь не может опубликовать (полное) решение еще 5 часов...? - person someuser; 18.10.2011

Не сработало:

$url = 'http://127.0.0.1:8983/solr/select?q=*&fq=shopid:40&start=0&rows=18';
$url .= '&fq=manufacturer:"Bausch' .urlencode('&'). 'Lomb"';
simplexml_load_file(rawurlencode($url));

Часть запроса производителя вышла как: "Bausch&Lomb";

Не сработало:

simplexml_load_file(rawurlencode('http://127.0.0.1:8983/solr/select?q=*&fq=shopid:40&start=0&rows=18&fq=manufacturer:"Bausch ' .urlencode('&'). ' Lomb"'))

Добавление пробелов рядом со словами Bausch и Lomb приводило к ошибке файла simplexml_load.

Работал:

simplexml_load_file(rawurlencode('http://127.0.0.1:8983/solr/select?q=*&fq=shopid:40&start=0&rows=18&fq=manufacturer:"Bausch+' .urlencode('&'). '+Lomb"'))

Замена пробелов на + работает!

Вот как я закончил делать это динамически.

$manufacturer = urlencode("Bausch & Lomb");
$manufacturer_insert = "&fq=manufacturer:\"$manufacturer\"";
$xml = simplexml_load_file(rawurlencode("http://127.0.0.1:8983/solr/select?q=$shopid_insert$start_insert$rows_insert$sort_insert$manufacturer_insert"));

Это работает для производителей с амперсандом в имени.

Важно отметить, что если вы передавали значения с пробелами, теперь их нужно будет закодировать перед добавлением. Например:

Прежде чем я мог просто использовать это для вставки сортировки:

$sort_insert = "&sort=price desc";

Теперь мне нужно urlencode просто "price desc". Когда я попытался urlencode всей строки sort_insert, запрос simplexml завершился ошибкой.

После (работает):

$sort = urlencode("price desc");
$sort_insert = "&sort=$sort";

Еще раз спасибо... Вернемся к проекту!

person someuser    schedule 18.10.2011