2010-06-17 30 views
5

Tôi đang gặp vấn đề. Tôi đang cố gắng để tạo ra một bot IRC, trong đó có một dấu và trong mật khẩu của nó. Tuy nhiên, tôi đang gặp sự cố khi đặt dấu và trong một chuỗi. Ví dụ:PHP Ampersand in String

<?php 

$var = "g&abc123"; 

echo $var; 

?> 

Tôi tin rằng điều này nên in g&abc123. Tuy nhiên nó đang in g.

Tôi đã cố gắng này là tốt:

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

này in một cách chính xác với g&abc123, tuy nhiên khi tôi nói echo $arr['key']; nó in g một lần nữa. Bất kỳ trợ giúp sẽ được đánh giá cao. Tôi đang chạy PHP5.3.1.

EDIT: Ngoài ra, tôi chỉ nhận thấy rằng nếu tôi sử dụng g&abc123&abc123, hãy in g&abc123. Bất kỳ đề xuất?

+0

Sản phẩm này ở đâu? –

+0

Tôi đã thử nghiệm trên PHP 5.2.9 và nó hoạt động tốt .... bây giờ đây là một lẻ. – websch01ar

Trả lời

5

Tôi không có vấn đề đó trong một giao diện điều khiển:

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

môi trường là gì bạn in đầu ra đến? Có vẻ như bạn đang xem nó trong trình duyệt web và & đang được hiểu là thực thể HTML không đúng định dạng. Thử thay thế biểu tượng & bằng phiên bản được mã hóa &amp;.

+0

Bạn đúng, tôi đang in trình duyệt. Tuy nhiên, nó không phải là một phần của một thẻ HTML, liên kết, vv Nó chỉ là văn bản duy nhất trên trang. Ngoài ra, tôi đã thử với & và DID hiển thị chính xác. Thật không may, đây là vấn đề vì tôi cần gửi dữ liệu đến máy chủ và tôi không chắc chắn liệu nó có được gửi dưới dạng g & abc123 hay không nếu nó được gửi dưới dạng g và tôi không thể gửi g & abc123. –

+1

Bạn có thể tự động chuyển văn bản thành biểu mẫu này với hàm htmlentities PHP và giải mã bằng html_entity_deocode - xem http://php.net/manual/en/function.html-entity-decode.php Nếu bạn gửi nó ở đâu đó, v.v. bạn có thể tự tin rằng giá trị được gửi là giá trị như được hiển thị bởi print_r. – JAL

+1

Bạn nói đúng. Tôi đã thử điều này trong Firefox và nó không xảy ra. Có vẻ như đó là sự cố của Chrome. Cảm ơn! –

5

Nhìn vào mã nguồn, mã sẽ in mã đúng.

Nếu bạn muốn nó để in ra một cách chính xác dưới dạng HTML, sau đó chạy htmlentities vào nó hoặc làm cho & &amp;

+0

Tôi đã kiểm tra mã nguồn, nó chỉ nói 'g'. –

+1

Sau đó, đã xảy ra sự cố với máy chủ của bạn - tôi vừa thử nghiệm (sao chép và dán mã của bạn): http://www.phoenixdev.net/test-2.php –

+0

Không có Kerry, trong Chrome, tôi nhận được kết quả tương tự. ;) Mặc dù không xảy ra trong Firefox. –

1

Xem nguồn trang web để đảm bảo biến của bạn chứa giá trị chính xác.

+0

Tôi đã làm điều đó 18 phút trước ... –

1

Có thể bạn đang gửi đầu ra của mình tới trình duyệt Web.

Cách thực hiện chính xác là

Trong HTML, XHTML và XML, ký hiệu và có ý nghĩa đặc biệt. Nó được sử dụng cho các thực thể ký tự. Bạn có thể nghĩ về nó như một chuỗi thoát.

Ví dụ, trong PHP, đây sẽ là bất hợp pháp:

$variable = 'It's Friday'; 

Điều này là do các dấu nháy đơn được giải thích bởi PHP như kết thúc chuỗi của bạn, và phần còn lại của nội dung của bạn trông giống như rác.

Thay vào đó, bạn có thể nói:

$variable = 'It\'s Friday'; 

Tương tự như vậy, trong HTML và XHTML, bạn không thể nói

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

này là bởi vì nó sẽ được hiểu là một phần tử.

Thay vào đó, bạn phải nói:

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

Bây giờ, như bạn có thể thấy, dấu và chính nó có một ý nghĩa đặc biệt và do đó, cần phải được thoát như &. htmlspecialchars() sẽ làm điều đó cho bạn.

+0

Vâng ... Tôi biết các ví dụ PHP ... Tôi cũng biết rằng & không có vấn đề trong Firefox. Tôi hiểu rằng trong XHTML (và có lẽ HTML quá) & là cách chính xác để làm điều đó. Nhưng tôi chưa bao giờ có một trình duyệt tức giận vì nó không được thực hiện theo cách đó. Hãy tin tôi đi, nếu tôi cố gắng làm cho XHTML hợp lệ này, nó sẽ là một &, nhưng tôi chỉ sử dụng nó cho mục đích gỡ lỗi. –

+0

Thật không may, các trình duyệt được thiết kế để chấp nhận bất cứ thứ gì bạn ném vào chúng, nhưng cách nó được xử lý là tùy thuộc vào cách giải thích. Nhóm HTML5 đang cố gắng tạo ra một tiêu chuẩn cho việc xử lý "súp tag" ... Cá nhân tôi không quá hạnh phúc về điều đó, nhưng tôi có thể làm gì? Tôi khuyên bạn nên tạo bí danh cho echo htmlspecialchars ($ text); Ví dụ: hàm h ($ text) {echo htmlspecialchars ($ text); } – MapDot