2010-06-17 11 views
5

Mam pewien problem. Próbuję stworzyć bota IRC, który ma ampersand w swoim haśle. Mam jednak problem z umieszczeniem znaku ampersand w ciągu znaków. Na przykład ...Ampersand PHP w łańcuchu

<?php 

$var = "g&abc123"; 

echo $var; 

?> 

Wierzę, że powinno to wydrukować g&abc123. Jednak drukuje on g.

Próbowałem to także:

<?php 
$arr = array("key" => "g&abc123"); 
print_r($arr); 
?> 

Powoduje wydrukowanie go poprawnie z g&abc123 jednak kiedy mówię echo $arr['key']; drukuje g ponownie. Każda pomoc będzie doceniona. Używam PHP5.3.1.

EDIT: Ponadto zauważyłem, że jeśli użyję g&abc123&abc123, wydrukuje on g&abc123. Jakieś sugestie?

+0

Gdzie jest to wyjście? –

+0

Testowałem na PHP 5.2.9 i działa dobrze ... teraz jest to dziwne. – websch01ar

Odpowiedz

5

nie mam tego problemu w konsoli:

php > $d="g&abc123"; 
php > echo $d; 
g&abc123 

jakim środowisku są drukujesz wyjście? Wygląda na to, że przeglądasz go w przeglądarce internetowej, a kod & jest interpretowany jako zniekształcony obiekt HTML. Spróbuj zastąpić symbol & kodem encji &amp;.

+0

Masz rację, drukuję do przeglądarki. Jednak nie jest częścią tagu HTML, linku itp. Jest to jedyny tekst na stronie. Próbowałem też z & i wyświetlał poprawnie DID. Niestety, jest to problem, ponieważ muszę wysłać dane na serwer i nie jestem pewien, czy jest wysyłany jako g & abc123 lub jeśli jest wysyłany jako g, i nie mogę wysłać g & abc123. –

+1

Możesz automatycznie przekształcić tekst w ten formularz za pomocą funkcji htmlentities w PHP i dekodować za pomocą html_entity_deocode - patrz http://php.net/manual/en/function.html-entity-decode.php Jeśli przesyłasz go gdzieś, itp. możesz być pewny, że wysłana wartość jest wartością pokazaną przez print_r. – JAL

+1

Masz rację. Próbowałem tego w Firefoksie i tak się nie dzieje. Wygląda na problem z Chrome. Dzięki! –

5

Sprawdź kod źródłowy, zostanie wydrukowany prawidłowy kod.

Jeśli chcesz go wydrukować poprawnie w HTML, a następnie uruchomić htmlentities na nim lub dokonać & &amp;

+0

Sprawdziłem kod źródłowy, mówi tylko "g". –

+1

Coś jest nie tak z twoim serwerem - właśnie to przetestowałem (skopiowałem i wkleiłem twój kod): http://www.phoenixdev.net/test-2.php –

+0

Nie Kerry, w Chrome uzyskuję takie same wyniki. ;) Nie dzieje się jednak w Firefoksie. –

1

Wyświetl źródło strony internetowej, aby upewnić się, że zmienna zawiera poprawną wartość.

+0

Zrobiłem to 18 minut temu ... –

1

Prawdopodobnie przesyłasz swoje dane wyjściowe do przeglądarki internetowej.

Prawidłowy sposób robi to

w HTML, XHTML i XML, Ampersand ma szczególne znaczenie. Służy do oznaczania postaci. Możesz myśleć o nim jako o sekwencji ucieczki.

Na przykład w PHP, to byłoby nielegalne:

$variable = 'It's Friday'; 

To dlatego, że apostrof jest interpretowany przez PHP jako koniec swojego łańcucha, a reszta zawartości wygląda śmieci.

Zamiast tego, trzeba powiedzieć:

$variable = 'It\'s Friday'; 

Podobnie w HTML i XHTML, nie można powiedzieć

<h1>Inequalities</h1> 
<p> x<yz+3 </p> 

Dzieje się tak dlatego, że to być interpretowane jako element.

Zamiast tego, trzeba by powiedzieć:

<h1>Inequalities</h1> 
<p> x&lt;yz+3 </p> 

Teraz, jak widać, sama ampersand ma specjalne znaczenie, a zatem musi być ocalałem jako &. htmlspecialchars() zrobi to za Ciebie.

+0

No cóż ... Znam przykłady PHP ... Wiem też, że & nie ma problemu w Firefoksie. Rozumiem, że w XHTML (i prawdopodobnie również w HTML) & jest właściwym sposobem na to. Ale nigdy nie wpadłem w złość na przeglądarkę, ponieważ nie zostało to zrobione w ten sposób. Zaufaj mi, gdybym próbował stworzyć ten poprawny XHTML, byłby to &, ale używałam go tylko do celów debugowania. –

+0

Niestety, przeglądarki zostały zaprojektowane tak, aby akceptować wszystko, co na nich rzucasz, ale sposób, w jaki jest obsługiwany, podlega interpretacji. Zespół HTML5 próbuje stworzyć standard obsługi "zupy tagów" ... Nie jestem z tego powodu szczęśliwy, ale co mogę zrobić? Zalecam utworzenie aliasu dla echo htmlspecialchars ($ text); Przykład: funkcja h ($ text) {echo htmlspecialchars ($ text); } – MapDot